我有一篇简体中文文本,当以 UTF-8 格式读取时,其开头为´ÓºÜ¾ÃÒÔÇ°¿ªÊ¼
,而普通话工具(第一个搜索结果修复损坏的中文电子邮件) 已修复为正确的从很久以前开始
,但不清楚它是如何修复的。通过使用在线工具和十六进制编辑器,我知道每个字符都被编码为固定长度的 32 位:
c2b4 c393 从
c2ba c39c 很
c2be c383 久
c392 c394 以
c387 c2b0 前
c2bf c2aa 开
c38a c2bc 始
这也表明一个字符被编码为 c2**-c3** 范围内的两个 16 位字。使用 UTF-16 时,这些字符的第一个 16 位字始终为 0。UTF-8 仅对这些字符使用 24 位,而 Codepage 936 仅对每个字符使用 16 位。我可以使用哪种方法来确定正确的编码转换?
utf-8 表示法:
e4bb 8e 从
e5be 88 很
e4b9 85 久
e4bb a5 以
e589 8d 前
e5bc 80 开
e5a7 8b 始
cp936 表示:
b4d3 从
badc 很
bec3 久
d2d4 以
c7b0 前
bfaa 开
cabc 始
答案1
损坏的文本´ÓºÜ¾ÃÒÔÇ°¿ªÊ¼
长度为 14 个字符。由于正确的简体中文文本从很久以前开始
长度为 7 个字符,这立即表明每个简体中文字符可能对应于损坏文本中的两个字符。
损坏的文本中的字符在UTF-16中具有以下十六进制等价物(并且也具有OP中所示的cp936):
´ => b4
Ó => d3
º => ba
Ü => dc
¾ => be
à => c3
Ò => d2
Ô => d4
Ç => c7
° => b0
¿ => bf
ª => aa
Ê => ca
¼ => bc
我使用一个简单的 Java 程序完成了这个翻译,但是可以做同样事情的在线网站:
因此,Mandarin Tool 所需要做的就是将前两个损坏字符的十六进制值组合起来,以使用 CP 936 获取第一个简体中文字符,依此类推:
´ + Ó => b4 + d3 => b4d3 => 从
º + Ü => ba + dc => badc => 很
¾ + Ã => be + c3 => bec3 => 久
Ò + Ô => d2 + d4 => d2d4 => 以
Ç + ° => c7 + b0 => c7b0 => 前
¿ + ª => bf + aa => bfaa => 开
Ê + ¼ => ca + bc => cabc => 始
据推测,普通话工具可以验证损坏的文本的转换确实会产生有效的简体中文文本。
然后可以将每个简体中文 cp936 值映射到其 Unicode 代码点。 例如,从=0xB4D3= 代码点0x4ECE。一旦您有了 Unicode 代码点,您就可以转换为您想要的任何编码(cp936、GB 18030、UTF-16 等)。
您的问题中,我不清楚的一点是第一个列表,它显示了每个简体中文字符(例如c2b4 c393 从
)的 32 位表示。这看起来不对,因为字符的代码点(例如 的 0x4ECE 从
)和它的 32 位表示是同一个东西。还是我误解了什么?
答案2
非常感谢你们的解释!一开始我很难理解,现在我明白了!
顺便说一句,我也在学习的同时建立了一个普通话字符修复器!借助 ChatGPT + 上面分享的链接
如果有人正在为阅读乱码的普通话文本而苦恼: 普通话字符修复器