华宇拼音输入法论坛

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
查看: 24068|回复: 52
打印 上一主题 下一主题

“?”“?”“?”这三个字为何老是无法在输入法候选栏上显示呢?!

[复制链接]
跳转到指定楼层
1
发表于 2010-7-20 02:50:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我使用的紫光是目前最新版的6.7.0.24
我发现“?”“?”“?”这三个字很特别,它们不是一些特别偏僻的字,起码不会是扩展B区的字,这三个字就连比较普通的“宋体GB18030”字体也能支持显示了。而我的电脑安装了超大字符集,还按照这张帖子中http://bbs.unispim.com/viewthread.php?tid=7112&extra=&page=1 sanwsw兄的介绍,做好了注册表字体链接。我就连微软官方的“GB18030支持包”也安装好了。但结果却仍是令我啼笑皆非,我的输入法候选栏上,基本上连扩展BC区的字都能正常显示了,但偏偏就是这三个不太算偏僻的“偏僻字”,老是在我的输入法候选栏上留下“空档”(它不是常见的开天窗成了个方框,而是直接空了出来,如图)


在记事本上也是(记事本字体使用了“宋体”)



但这三个字在偏旁部首检字上却能正常显示:
                         


这是什么回事呢? 这三个“缺口”好烦人啊!!

[ 本帖最后由 Secask 于 2010-7-20 02:53 编辑 ]
2
发表于 2010-7-20 08:18:34 | 只看该作者
请用笔画辅助法输出这三个字符,看看是否另有一个能正常显示?实际上不止这三个字符(你试试:????????????????????????????????????????????????????????????????????????????????郎凉秊裏隣兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩)。GBK字符集专用区内的大多如此



[ 本帖最后由 sanwsw 于 2010-7-20 08:30 编辑 ]
3
发表于 2010-7-20 08:22:25 | 只看该作者
下列两词均为现汉收录。造词时选择能显示的那个,即可正常显示和输出。
  
4
发表于 2010-7-20 10:37:12 | 只看该作者
皮肤透明引起的后遗症,PUA区域的80个汉字,使用新的渲染方式后,在个别字体下显示不正常。

LZ不妨把皮肤中的中文字体换一下,看看效果吧。我这里是win7,没有安装其他fonts,用微软雅黑输出有问题,用宋体、新宋体输出“?”没有问题,其他两个字没有测试。
5
 楼主| 发表于 2010-7-20 13:42:57 | 只看该作者
原帖由 sunmd 于 2010-7-20 10:37 发表
皮肤透明引起的后遗症,PUA区域的80个汉字,使用新的渲染方式后,在个别字体下显示不正常。

LZ不妨把皮肤中的中文字体换一下,看看效果吧。我这里是win7,没有安装其他fonts,用微软雅黑输出有问题,用宋体、新宋 ...

嗯,我改用宋体-18030之后,这三个字就能正常显示了。但为什么你用宋体输出没有问题,我用宋体输出则有问题,要改用宋体-18030呢?
我用的是XP SP3

[ 本帖最后由 Secask 于 2010-7-20 13:59 编辑 ]
6
 楼主| 发表于 2010-7-20 14:36:50 | 只看该作者
结合sanwsw的意见,看来以下字符是零舍不同的:
???????????????????????????????????????????????????????????????????????????????????郎凉秊裏隣兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩
7
发表于 2010-7-20 14:37:48 | 只看该作者
原帖由 Secask 于 2010-7-20 13:42 发表

嗯,我改用宋体-18030之后,这三个字就能正常显示了。但为什么你用宋体输出没有问题,我用宋体输出则有问题,要改用宋体-18030呢?
我用的是XP SP3

win7的宋体与xp的宋体不同。同时最近用win7,感觉在字体上比xp改进很多,听说在不安装大字符集的情况下能支持大部分unicode编码的汉字了。
8
 楼主| 发表于 2010-7-20 14:40:17 | 只看该作者
原帖由 sunmd 于 2010-7-20 14:37 发表

win7的宋体与xp的宋体不同。同时最近用win7,感觉在字体上比xp改进很多,听说在不安装大字符集的情况下能支持大部分unicode编码的汉字了。

嗯,是的,我向一些使用WIN 7的朋友通过QQ发出一些扩展B区的汉字,他们都能正常阅读(未装任何大字符集)
9
发表于 2010-7-20 14:40:36 | 只看该作者
原帖由 Secask 于 2010-7-20 14:36 发表
结合sanwsw的意见,看来以下字符是零舍不同的:
????????????????????????????????????????????????????????????????????????????? ...

这就是PUA区域的那80个汉字吧。不妨使用"汉字管理",转到“编码检字”页签,输入“E8”,过滤出来的这80个汉字
10
 楼主| 发表于 2010-7-20 20:29:27 | 只看该作者
对于那80个“特殊汉字”,我发现我的火狐浏览器对无法正常显示,这就更令我郁闷了。因为平常来说,经过安装了超大字符集支持包及做好有关字体链接后,我的火狐浏览器即使遇到一些扩展B区的汉字都能正常显示了。但为何就偏偏这几十个特殊汉字那么“难缠”了?

带着一点不忿的情绪,我“研究”一下这些汉字。首先我把火狐的网页字体设置为宋体-18030(至于为何我不把它设置为传统的宋体,是由于我原先设置为宋体的时候,又遇到了一个问题,所以为了避免干扰,我先把字体设为宋体-18030),然后我又通过对网页编码在GB2312、GBK和GB18030之间进行切换来对比,看看这些汉字在应用不同编码的情况下的显示情况,结果截图如下:
       

我发现,这些汉字似乎跟GBK编码有点“水火不容”,在GBK编码情况下,这些汉字相当多成了“乱码”。但在GB18030下和更为老旧的GB2312下,则显示正常,考虑到GB18030完全兼容GB2312的编码,我判断这些汉字属于GB18030里面的汉字,又考虑到我已经使用上完全支持GB18030的字体“宋体-18030”,我怀疑是不是GBK对这八十多个汉字兼容有问题呢?
再考虑到目前大多数软件都使用GBK编码标准,而那三个字“”“”“”就在这八十多个汉字之中,“”“”“”在紫光输入法候选栏上显示不正常,是否也跟GBK编码不兼容有关呢?

[ 本帖最后由 Secask 于 2010-7-20 22:29 编辑 ]
11
 楼主| 发表于 2010-7-20 23:18:12 | 只看该作者
补充一个新发现的问题,同样是在这张帖子中,同样页面使用宋体-18030字体,同样使用GBK编码查看本页面,一楼、二楼、六楼的“?”“?”“?”等字成了乱码,但10楼的这些字则正常显示了。怎么回事呢?仔细一想,一楼的字是我用IE浏览器发的,但按理说浏览器不会影响到字符效果显示啊?再细心一看,原来是IE浏览器对紫光论坛一律默认使用GB2312编码,而在六楼的跟帖中,虽然我也用火狐发帖,但我也预先把页面编码改为GB18030,考虑到GB18030与GB2312完全兼容,看来还是GBK跟GB18030/2312不兼容这原因在作怪,如果发帖时使用GB18030/2312编码,那么看帖时若使用GBK,则会出现这些字的乱码。看来这些字的编码,正是GBK与GB18030/2312不兼容的地方。

为了证实以上猜想,我下面将会做一下测试。
12
 楼主| 发表于 2010-7-20 23:23:17 | 只看该作者
在火狐浏览器下,使用GBK编码发表上述“怪异”字:
䝼䞍⺁⺄㑳㑇⺈⺋㖞㘚㘎⺌⺗㥮㤘㧏㧟㩳㧐㭎㱮㳠⺧⺪䁖䅟⺮䌷⺳⺶⺷䎱䎬⺻䏝䓖䙡䙌䜣䜩䝼䞍⻊䥇䥺䥽䦂䦃䦅䦆䦟䦛䦷䦶䲣䲟䲠䲡䱷䲢䴓䴔䴕䴖䴗䴘䴙䶮郎凉秊裏隣兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩
13
 楼主| 发表于 2010-7-20 23:30:25 | 只看该作者
在火狐浏览器下,使用GB2312编码发表上述怪异字符:
、、
14
 楼主| 发表于 2010-7-20 23:33:34 | 只看该作者
在火狐浏览器下,使用GB18030编码发表上述字符:
15
 楼主| 发表于 2010-7-20 23:45:51 | 只看该作者
12、13、14楼效果截图如下(使用火狐、GBK编码,字体宋体-18030 看帖)
  

气死我啦,怎么毫无规律可言啊?我11楼的猜想有错?
13楼和1楼同是使用GB2312编码的,只不过一个是在IE下发,一个是在火狐下发,怎么显示效果就不一样了啊!!??难不成IE的GB2312跟火狐的GB2312又不兼容?????
14楼我使用GB18030编码的,六楼我也是使用GB18030编码的,怎么六楼我还看到一些乱码,14楼就一片空白,一个字都看不到了啊!??记得六楼的那些字符我是直接复制自二楼sanwsw的,而14楼的“”“”“”则是我自己录入的,难道这也有区别了吗???

这些字符编码的,真是混乱啊,怎么那么多变数啊,毫无规律可遵循的,怎么回事啊???
16
发表于 2010-7-21 07:22:30 | 只看该作者
Secask 兄的执著,很令我敬佩!
17
 楼主| 发表于 2010-7-21 23:23:38 | 只看该作者
原帖由 野风 于 2010-7-21 07:22 发表
Secask 兄的执著,很令我敬佩!

其实,我对这些乱码问题,特别是扩展字集的那些乱码问题,是一直十分关注的。因为我以前曾经试过即使安装了补丁包,甚至连字体链接都做好了,仍然出现某某字无法正常显示的情况。我总是有种感觉,就是这些字体显示,除非系统已经帮你设定好的(例如GBK那些),其它的那些扩展字集,不管你安装了多少补丁包,做了多少字体链接,系统它想显示就显示,不显示就不显示,你对此无可奈何,很令人抓狂。所以我对此老大难问题,一直都想好好研究一下。

我知道这个论坛不乏关注这类问题的朋友,我希望能通过一同探讨,好好向这些朋友学习一下。
我打算在这张帖子里,深入探讨这个问题,希望有人能够参与因为我真的想了解一下这方面知识

[ 本帖最后由 Secask 于 2010-7-22 11:49 编辑 ]
18
 楼主| 发表于 2010-8-10 20:19:37 | 只看该作者
扩展A区三个汉字:

㷫㓥㗎

[ 本帖最后由 Secask 于 2010-8-10 20:39 编辑 ]
19
发表于 2010-8-10 21:24:56 | 只看该作者
http://www.pkucn.com/viewthread.php?tid=175512
这一篇文章可参考。
GB18030分单字节、双字节、四字节三种,GBK和GB2312都是双字节ANSI编码。
GB18030输入的汉字那是一定要用GB18030显示的,6楼和14楼不一样,那肯定是复制的缘故。
火狐和IE的GBK和GB2312显示不一样,可能是win平台和linux平台的处理方式不一样(可能对这一段块编码不同,火狐和IE显示的是不同的字)。
GB18030实在是不建议使用,建议直接用unicode的utf-8编码。
20
 楼主| 发表于 2010-8-12 00:07:16 | 只看该作者
原帖由 racingstar 于 2010-8-10 21:24 发表
http://www.pkucn.com/viewthread.php?tid=175512
这一篇文章可参考。
GB18030分单字节、双字节、四字节三种,GBK和GB2312都是双字节ANSI编码。
GB18030输入的汉字那是一定要用GB18030显示的,6楼和14楼不一样,那肯定是复制的缘故。
火狐和IE的GBK和GB2312显示不一样,可能是win平台和linux平台的处理方式不一样(可能对这一段块编码不同,火狐和IE显示的是不同的字)。
GB18030实在是不建议使用,建议直接用unicode的utf-8编码。

难怪了。一楼的那几个汉字,是在IE下用GB2312编码发出的,但换作火狐,用GBK编码,则变成了乱码了。可能就是racingstar你所说的两者处理方式不一样的缘故吧。(不过,我火狐和IE都是在WINDOWS系统上运行的啊?)
至于GB18030跟unicode的UTF-8编码,racingstar你建议我采用UTF-8编码,我不太明白。因为,采用哪套编码好像是有网页自身设定的,跟用户无关吧?其实我发现很多网页要不用Unicode编码,要不用GBK编码,真的甚少使用GB18030编码的。


还有一个可能很低级的问题:
宋体-18030不是一种基于GB18030编码的字体么?在一些Unicode编码的网页中,为何它也能够正常显示出字符呢,那些字符不都用unicode编码了吗,宋体-18030又怎能识别这些编码呢?同理,宋体是基于GBK的吧,为何遇到一些unicode编码的网页,它也能支持显示那些用unicode编码的字符呢?
21
发表于 2010-8-12 08:45:03 | 只看该作者
支个招:
①使用我在本坛上传的“方正楷体”作为皮肤的中文字体;
②安装国际标准超大字符集字体支持包UniFonts5.4;
③做好系统字体的必要链接(搜索相关帖子)。
22
发表于 2010-8-12 11:00:54 | 只看该作者
字体不存在编码的问题,宋体-18030只是说本字体带有GB18030规定的两万七千多个字,同样GBK字体就是说字体带有GBK规定的两万一千多个字。如果你的字体中字不够,那最多就是开天窗,比如你选择楷体GB2312字体显示网页,它还是会显示字体中带有的字,字体中没的字开天窗。
Firefox是windows和linux全平台开发的,代码要保证在linux和win下都能够编译,我猜测还是两种平台字体调用有区别。
23
 楼主| 发表于 2010-8-12 11:09:36 | 只看该作者
原帖由 racingstar 于 2010-8-12 11:00 发表
字体不存在编码的问题,宋体-18030只是说本字体带有GB18030规定的两万七千多个字,同样GBK字体就是说字体带有GBK规定的两万一千多个字。如果你的字体中字不够,那最多就是开天窗,比如你选择楷体GB2312字体显示网页,它还是会显示字体中带有的字,字体中没的字开天窗。
Firefox是windows和linux全平台开发的,代码要保证在linux和win下都能够编译,我猜测还是两种平台字体调用有区别。

那我是否可以这样理解:
编码的解码是程序(例如浏览器)的问题,只要告知浏览器网页的编码(选择正确的字符编码),浏览器即可正确解码出字符,然后就可以调用字体来显示了。字体文件本身并不需要识别各种编码,解码的工作是交由浏览器等需要调用字体的程序负责的,与字体无关?
24
 楼主| 发表于 2010-8-12 11:11:57 | 只看该作者
原帖由 sanwsw 于 2010-8-12 08:45 发表
支个招:
①使用我在本坛上传的“方正楷体”作为皮肤的中文字体;
②安装国际标准超大字符集字体支持包UniFonts5.4;
③做好系统字体的必要链接(搜索相关帖子)。
5740 5741 5742

嗯,谢谢sanwsw。输入法显示那些字符的问题我已经顺利解决了,只要字体不用宋体,改为宋体-PUA或者新宋体甚至宋体-18030等等就可以了

现在我是想继续了解一些字符编码和字符显示的机制
25
发表于 2010-8-12 12:27:06 | 只看该作者
原帖由 Secask 于 2010-8-12 11:09 发表

那我是否可以这样理解:
编码的解码是程序(例如浏览器)的问题,只要告知浏览器网页的编码(选择正确的字符编码),浏览器即可正确解码出字符,然后就可以调用字体来显示了。字体文件本身并不需要识别各种编码, ...

可以这么说,有专用的api去解码,当然字体文件一定是要按照编码表排序的。
26
发表于 2010-8-12 19:18:08 | 只看该作者
计算机只认识0和1的比特流,一个字节有8个比特位。
那一个字节能表示00000000-11111111之间的一个数字,变成10进制就是0-255,变成16进制就是00-FF,总共能表示256个字符。
我们要对字符编码,就必须要有一个字符集,在这个字符集中定义了每一个字符对应的字节。
比如大写字母A,我们定义用16进制的41表示,那么转换成2进制,就是01000001。那计算机碰到一个字节是01000001的话,它就会解码成对应的字符。
美国就制定了这样一个字符集,用一个字节表示字符,叫做ascaii字符集。但是这样的话,最多也只能表示256个字符,后来就扩展可以使用2个字节编码,这样能表示更多的字符。
当然扩展成2个字节编码还是要兼容原来的ascaii字符集的,比如我们的GBK字符集就定义如果遇到一个字节大于127,那么这个字节和后面一个字节共同表示一个字符;如果第一个自己小于127,那么这个字节就单独表示一个字符,就是ascaii中定义的相关字符。这一类从ascaii字符集扩展出来的字符集,我们统称其编码方式为ANSI编码。采用ANSI编码,需要一个或两个字节表示一个字符。
Unicode编码能表示更多的字符,范围从00000-10FFFF,但是我们不能就这样直接表示一个字符,因为计算机不知道这个字符是从哪个字节开始哪个字节结束的,所以必须加上控制位,然后就出现了utf-8,utf-16,utf-32等各种unicode编码。
GB18030的问题在于有6000多个字符是四个字节表示的,并且这个字符集还要兼容GBK和GB3212,GBK和GB3212是ANSI编码,而ANSI编码是一个或两个字节表示一个字符的。但是GB18030是中国制定的字符集标准,销售到中国的产品必须要支持,微软就采用了一种特别的方式来识别GB18030字符集。但是这种不伦不类的字符集,实在是鸡肋,有四个字节的字符,不能用unicode编码,因为要兼容ANSI编码的字符集,微软只能费点时间来实现,表示我的产品是支持这个字符集的,就可以在中国卖了,实际没什么人使用,兼容性太差。

[ 本帖最后由 racingstar 于 2010-8-12 19:53 编辑 ]
27
 楼主| 发表于 2010-8-12 19:23:02 | 只看该作者
那么解码是怎样的机制?
例如,宋体-18030是按照GB18030编码排序,那么宋体-18030里应该有GB18030的编码信息。那么对于一些Uniocde编码的页面,浏览器是不是先把它转换成字体的编码(GB18030)而去调用字体?
28
 楼主| 发表于 2010-8-12 19:26:06 | 只看该作者
原帖由 racingstar 于 2010-8-12 19:18 发表
计算机只认识0和1的比特流,一个字节有8个比特位。
那一个字节能表示00000000-11111111之间的一个数字,变成10进制就是0-255,变成16进制就是00-FF,总共能表示256个字符。
我们要对字符编码,就必须要有一个字符集,在这个字符集中定义了每一个字符对应的字节。
比如大写字母A,我们定义用16进制的41表示,那么转换成2进制,就是01000001。那计算机碰到一个字节是01000001的话,它就会解码成对应的字符。
但是这样的话,最多也只能表示256个字符,后来就扩展可以使用2个字节编码,这样能表示更多的字符。这一类ascaii字符集扩展,我们都称为ANSI编码。
unicode编码能表示更多的字符,从00000-10FFFF,但是我们不能就这样直接表示一个字符,因为计算机不知道这个字符哪里开始哪里结束,所以必须加上控制位,然后就出现了utf-8,utf-16,utf-32等各种unicode编码

那什么叫做控制位呢?可不可以这样理解,计算机的信息,就是一大堆有字节组成的信息流,而字体也是用信息流表示的。但不是所有的字节都是字符信息,还有一些是颜色、排版信息等等。而控制位,就是告诉计算机,哪个到哪个字节是代表字符的,并是怎样编码的,由此衍生出unicode、GBK等各种编码?
29
发表于 2010-8-12 20:10:29 | 只看该作者
计算机的信息是一组比特流。我们定义了一个字节有8个比特。
那计算机是怎么知道我输入的字节是从哪个比特位开始的呢?这个是靠硬件实现的,集成电路的开关电路一定是按照最基本的8个逻辑开关为一组设计的。
比如说总线带宽256位512位,一定是8的倍数,cpu的逻辑处理单元也一定是按照8个比特位一组的方式设计的,一下子能够处理8个比特位。
所以我们在应用层要关心的是,怎么判定到底是几个字节表示一个字符。比如说ANSI编码的字符,一定是一个或两个字节的。读到的字节位小于127,就直接解码,读到的字节位大于127,就和后面一个字节一起解码。
unicode编码,有很多方式,各个编码方式的控制字节都不一样,这个可以google上搜一下具体的定义。
30
发表于 2010-8-12 20:42:22 | 只看该作者
原帖由 Secask 于 2010-8-12 19:23 发表
那么解码是怎样的机制?
例如,宋体-18030是按照GB18030编码排序,那么宋体-18030里应该有GB18030的编码信息。那么对于一些Uniocde编码的页面,浏览器是不是先把它转换成字体的编码(GB18030)而去调用字体?

无论什么编码,程序都会解码,然后按照解码后的顺序去读取字体文件。字体文件里面字符的编排顺序是固定的,字体没有编码的说法。
http://download.csdn.net/source/2044299
gb18030所有汉字的编码,你可以下载这个文件查看。
你可以注意到同一个字符的GBK编码和unicode编码不一样,但是字体文件字符的编排顺序是固定的,那么是怎么读取的呢?因为程序会先读取字体的分页信息,如果你是GBK编码,程序会读取GBK的分页信息,找到对应解码后字体的地址位。

[ 本帖最后由 racingstar 于 2010-8-12 20:53 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|华宇拼音输入法网站  

GMT+8, 2025-12-25 22:23

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表