Joh*_*ken 5 encoding vim unicode chinese
我有一个简体中文文本,当读取为 UTF-8 开头时, MandarinTools\xc2\xb4\xc3\x93\xc2\xba\xc3\x9c\xc2\xbe\xc3\x83\xc3\x92\xc3\x94\xc3\x87\xc2\xb0\xc2\xbf\xc2\xaa\xc3\x8a\xc2\xbc的在线工具(修复损坏的中文电子邮件的第一个搜索结果)将其修复为正确的,但不清楚它是如何修复的那。通过使用在线工具和十六进制编辑器,我知道每个字符都被编码为固定长度的 32 位:\xe4\xbb\x8e\xe5\xbe\x88\xe4\xb9\x85\xe4\xbb\xa5\xe5\x89\x8d\xe5\xbc\x80\xe5\xa7\x8b
c2b4 c393 \xe4\xbb\x8e\nc2ba c39c \xe5\xbe\x88\nc2be c383 \xe4\xb9\x85\nc392 c394 \xe4\xbb\xa5\nc387 c2b0 \xe5\x89\x8d\nc2bf c2aa \xe5\xbc\x80\nc38a c2bc \xe5\xa7\x8b\nRun Code Online (Sandbox Code Playgroud)\n\n这也表明一个字符被编码为 c2**-c3** 范围内的两个 16 位字。对于 UTF-16,这些字符的第一个 16 位字始终为 0。UTF-8 仅使用每个字符 24 位,而代码页 936 此处仅使用每个字符 16 位。\n我可以使用哪种方法来确定正确的编码转换?
\n\nutf-8表示:
\n\ne4bb 8e \xe4\xbb\x8e\ne5be 88 \xe5\xbe\x88\ne4b9 85 \xe4\xb9\x85\ne4bb a5 \xe4\xbb\xa5\ne589 8d \xe5\x89\x8d\ne5bc 80 \xe5\xbc\x80\ne5a7 8b \xe5\xa7\x8b\nRun Code Online (Sandbox Code Playgroud)\n\ncp936表示:
\n\nb4d3 \xe4\xbb\x8e\nbadc \xe5\xbe\x88\nbec3 \xe4\xb9\x85\nd2d4 \xe4\xbb\xa5\nc7b0 \xe5\x89\x8d\nbfaa \xe5\xbc\x80\ncabc \xe5\xa7\x8b\nRun Code Online (Sandbox Code Playgroud)\n
小智 3
损坏的文本\xc2\xb4\xc3\x93\xc2\xba\xc3\x9c\xc2\xbe\xc3\x83\xc3\x92\xc3\x94\xc3\x87\xc2\xb0\xc2\xbf\xc2\xaa\xc3\x8a\xc2\xbc有 14 个字符长。由于正确的简体中文文本\xe4\xbb\x8e\xe5\xbe\x88\xe4\xb9\x85\xe4\xbb\xa5\xe5\x89\x8d\xe5\xbc\x80\xe5\xa7\x8b有 7 个字符长,这立即表明每个简体中文字符可能对应于损坏文本中的两个字符。
损坏文本中的字符在 UTF-16 中具有以下十六进制等效项(以及如 OP 中所示的 cp936):
\n\n\xc2\xb4 => b4\n\xc3\x93 => d3\n\xc2\xba => ba\n\xc3\x9c => dc\n\xc2\xbe => be\n\xc3\x83 => c3\n\xc3\x92 => d2\n\xc3\x94 => d4\n\xc3\x87 => c7\n\xc2\xb0 => b0\n\xc2\xbf => bf\n\xc2\xaa => aa\n\xc3\x8a => ca\n\xc2\xbc => bc\nRun Code Online (Sandbox Code Playgroud)\n\n我使用一个简单的 Java 程序进行了翻译,但是有一些在线网站可以做同样的事情:
\n\n\n\n因此,Mandarin Tool 需要做的就是结合前两个损坏字符的十六进制值,以使用 CP 936 获取第一个简体中文字符,依此类推:
\n\n\xc2\xb4 + \xc3\x93 => b4 + d3 => b4d3 => \xe4\xbb\x8e\n\xc2\xba + \xc3\x9c => ba + dc => badc => \xe5\xbe\x88\n\xc2\xbe + \xc3\x83 => be + c3 => bec3 => \xe4\xb9\x85\n\xc3\x92 + \xc3\x94 => d2 + d4 => d2d4 => \xe4\xbb\xa5\n\xc3\x87 + \xc2\xb0 => c7 + b0 => c7b0 => \xe5\x89\x8d\n\xc2\xbf + \xc2\xaa => bf + aa => bfaa => \xe5\xbc\x80\n\xc3\x8a + \xc2\xbc => ca + bc => cabc => \xe5\xa7\x8b \nRun Code Online (Sandbox Code Playgroud)\n\n据推测,普通话工具会验证损坏文本的转换确实会产生有效的简体中文文本。
\n\n然后,每个简体中文 cp936 值都可以映射到其 Unicode 代码点。例如,\xe4\xbb\x8e = 0xB4D3 = 代码点0x4ECE。一旦获得 Unicode 代码点,您就可以转换为您想要的任何编码(cp936、GB 18030、UTF-16 等)。
\n\n在你的问题中我不清楚的一点是第一个列表,显示了每个简体中文字符的 32 位表示(例如c2b4 c393 \xe4\xbb\x8e)。这看起来不对,因为字符的代码点(例如 0x4ECE \xe4\xbb\x8e)和它的 32 位表示是相同的。或者我误解了什么?
| 归档时间: |
|
| 查看次数: |
9199 次 |
| 最近记录: |