V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
SolidZORO
V2EX  ›  问与答

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

  •  
  •   SolidZORO · 2011-03-10 20:59:52 +08:00 · 5005 次点击
    这是一个创建于 5026 天前的主题,其中的信息可能已经有所发展或是发生改变。
    10 条回复    1970-01-01 08:00:00 +08:00
    SolidZORO
        1
    SolidZORO  
    OP
       2011-03-10 21:02:39 +08:00
    后来试了一下搜索 “無敵”。变成了“无敌”。 看来baidu是在简/繁转换的时候把自己给搞挂了。导致了悲剧发生。
    freefcw
        2
    freefcw  
       2011-03-10 21:18:21 +08:00
    寨厂内部人士说,内部编码太多, suggestion 支持搜索不支持
    est
        3
    est  
       2011-03-10 21:54:47 +08:00
    @SolidZORO 这个出错应该是浏览器编码请求之前就出错了。但是gbk里这两个字的确是3byte编码。
    est
        4
    est  
       2011-03-10 22:02:08 +08:00
    这个可能是windows的特例?因为 齟齬 是GB 18030 里的。然后windows下的gbk默认就是gb18030,而且有3、4字节。
    SolidZORO
        5
    SolidZORO  
    OP
       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
        6
    zainix  
       2011-03-11 11:56:46 +08:00
    VPN + Google吧, 用百度能做什么!?
    lianghai
        7
    lianghai  
       2011-03-11 12:42:33 +08:00
    赞考据。不过,“3 位 Unicode”是什么?
    SolidZORO
        8
    SolidZORO  
    OP
       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
        9
    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
        10
    SolidZORO  
    OP
       2011-03-11 22:57:12 +08:00
    @lianghai 也就是 固定3byte。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   917 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 64ms · UTC 20:01 · PVG 04:01 · LAX 12:01 · JFK 15:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.