乱码产生的原因:
我发现,百度贴吧有意将全角中文标点“<”和“>”替换成相应的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”被替换后的结果!
我发现,百度贴吧有意将全角中文标点“<”和“>”替换成相应的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”被替换后的结果!