百度搜索“齟齬”,然后貌似Unicode越界了,Google正常,这是因为百度使用gbk的缘故还是真的使用了传说中的3位 Unicode?

2011-03-10 20:59:52 +08:00
 SolidZORO
4847 次点击
所在节点    问与答
10 条回复
SolidZORO
2011-03-10 21:02:39 +08:00
后来试了一下搜索 “無敵”。变成了“无敌”。 看来baidu是在简/繁转换的时候把自己给搞挂了。导致了悲剧发生。
freefcw
2011-03-10 21:18:21 +08:00
寨厂内部人士说,内部编码太多, suggestion 支持搜索不支持
est
2011-03-10 21:54:47 +08:00
@SolidZORO 这个出错应该是浏览器编码请求之前就出错了。但是gbk里这两个字的确是3byte编码。
est
2011-03-10 22:02:08 +08:00
这个可能是windows的特例?因为 齟齬 是GB 18030 里的。然后windows下的gbk默认就是gb18030,而且有3、4字节。
SolidZORO
2011-03-10 23:31:45 +08:00
@est 出错原因应该是:打个比方把。 我们要搜索AAA。
输入AAA的时候,点搜索。
AAA被发送到服务器,通过内部转换程式转换,变成aaa。
但是由于AAA没有对应的aaa,或者软件不够智能(比如编码溢出,AAA是UTF8,但是程序只支持GBK-gb2312,那么UFT8的字符-gb2312必然出错了)。
最后导致了显示搜索结果错误。


其实搜索 【齟】或者【齬】都不会错的。就算给她搭上【齟a】这样搜索也都还是会转对的。但是两个粘起来,就错了。这是为什么呢?

【齟齬】变成了 【e r】三个字符er中间有空格。


216322;齟;U+9F5F
216327;齬;U+9F6C

e:101;e;U+0065
:32; ;U+0020
r:114;r;U+0072



再来看看编码范围;
----------------------------------------------
GBK
编码范围: 0×8140 - 0xFEFE

BIG5
编码范围: 0xA140 - 0xF9FE, 0xA1A1 - 0xF9FE

GB2312
编码范围: 0xA1A1 - 0xFEFE
汉字范围: 0xB0A1 - 0xF7FE

GB18030
编码范围:
单字节、是0x00-0x7F,完全等同与ASCII;
双字节、编码范围和GBK相同,高字节是0x81-0xFE,低字节的编码范围是0x40 -0x7E和0x80-FE;
四字节、编码编码中第一、三字节的编码范围是0x81-0xFE,

Unicode
编码范围:
0-0x10FFFF,这个是个很大的值了。
-------------------------------------------------------

216322;齟;U+9F5F
216327;齬;U+9F6C

很显然。他们在GBK,GB18030,和Unicode里面。就是不在GB2312里。

但是问题应该不是出在这里,而齟齬单输入也能正常的识别,证明问题也不是繁简转换字码的问题。

打开Unicode发现齟齬是靠后CJK编码很后的字了。齟齬右边再过不到100个字符,CJK就完了。 估计百度写程序的时候没有考虑到很大的位数link起来。比如他们link起来之后就是 9F5F9F6C的小bug问题。就给越界了。

但是问题,【龃龘】他们又得到正确的显示。这个我就真不知道为什么了。



还得请高手作答。
zainix
2011-03-11 11:56:46 +08:00
VPN + Google吧, 用百度能做什么!?
lianghai
2011-03-11 12:42:33 +08:00
赞考据。不过,“3 位 Unicode”是什么?
SolidZORO
2011-03-11 18:55:36 +08:00
理论上 一个汉字可以由2byte搞定,当然,这是在GB2312下。
而在Unicode下,是4byte。

有人为了减少储存空间(同事也提高了搜寻的效率)。给Unicode动了一下手脚,把原来Unicode范围\0x000000 ~ \0x10FFFF,改成最常用的范围: \0x0000 ~ \0x10FF,(其实最常用的字符在\0x4E00 ~\0x9FA5,即CJK Unified Ideographs。)

这样显示GB2312,Big5什么的都没问题了。
lianghai
2011-03-11 21:15:19 +08:00
@SolidZORO 我还是没明白……
Unicode 本身不规定具体的编码方式啊,现在常用的编码是 UTF-8、UTF-16 和 UTF-32。UTF-8 里每个字符使用的字节数是 1 或 3 或 4,UTF-16 用的是 2 或 4,而 UTF-32 是 4。你说的是 UTF-16 模式的汉字?
“动了一下手脚”指的又具体是什么?
SolidZORO
2011-03-11 22:57:12 +08:00
@lianghai 也就是 固定3byte。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/9566

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX