您的位置:首页 > 其它

近期百度贴吧乱码问题的原因解析及解决方法

2009-01-13 21:36 609 查看
最近几天,百度贴吧发帖频频出现乱码,并伴随 ?#65308; ?#65310; 之类怪异代码。



乱码产生的原因:

我发现,百度贴吧有意将全角中文标点“<”和“>”替换成相应的html转义代码。两个标点的机内字节码分别为 A3 BC 和 A3 BE (两个字节存储一个汉字),相应的转义代码分别为 < >。但这种替换只是简单的单字节字符串的匹配和替代,并未按汉字编码的双字节进行分割,导致相邻的两个汉字的 [前一个汉字的第二字节] 与 [后一个汉字的第一字节] 极有可能“拼凑”出 A3 BC 或 A3 BE ,倘若将此处的两个字节替换成转义代码,会截断这前后两个汉字,并导致后续的双字节汉字全部错位!

例如,“常见”的字节码是 B3 A3 BC FB ,中间的 A3 BC 恰巧是“<”的编码,这两个字节被替换成了<字符串,余下了前面的 B3 和后面的 FB 两个残缺的字节,FB字节再与后面的双字节序列组合,导致后续字节组合全部错位(除非遇到ASCII单字节字符)!如图,第一个窗口是“<>”两个字符的字节码,其中 A3 BC 是“<”的编码;第二个窗口是“常见”的字节码,看以看出中间两个字节正是“A3 BC”;第三个窗口中的字符串包含了“常见”;第四个窗口是经百度发帖程序替换过的,图中选中区域是“<”的字节码,恰巧是第三个窗口中的“A3 BC”被替换后的结果!



基于上述原理,我编写程序对汉字字库进行搜索,结果分成AB两组:A组是第二字节为A3的汉字,B组是第一字节为BC或BE的汉字。分别从A组合B组任意取出一个字,前后组合必定会产生乱码。搜索发现,“A组”大约有120个,“B组”大约有390个,也就是说这种组合约为45600种,并不是一个小数目,而这其中包括月40个常用词,比如“常见、埃及、海景、模具、疲倦、危急、祝酒”等,可见出现乱码的概率是极高的!我到“埃及吧”、“模具吧”、“海景吧”看了一下,果然最近几天的新帖子都是乱码!

解决方法与处理建议:

对吧友们来说,发帖时可以在这种组合的词之间加一个空格以避免乱码。
对百度技术人员来说,这个bug导致的乱码太多了,应尽快修复。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: