Python 使用 euc-kr 编码以意想不到的方式对(韩语)字符进行编码(编解码器、编码模块)

5 python unicode encoding character-encoding

我尝试在 python 中读取一些以“euc-kr”编码的韩语文本文件,但出现了一些错误。检查后encodings模块一段时间后,我了解到该模块以看似非常奇怪的方式对韩语字符进行编码。让我举个例子

\n\n

韩语字符\xed\x83\x87(这是一个很少使用的字符,但我需要这个作为发音词典)应该根据 EUC-KR 规范编码为B5 6E (我参考了这个网站。但编码模块给了我一些不同的结果。

\n\n
# python3\n>> from encodings import euc_kr\n>> euc_kr.codec.decode(b\'\\xB5\\x6E\')\nTraceback (most recent call last):\n  File "<stdin>", line 1, in <module>\nUnicodeDecodeError: \'euc_kr\' codec cant decode byte 0xb5 in position 0: illegal multibyte sequence\n>> euc_kr.codec.encode(\'\xed\x83\x99\')\n(b\'\\xa4\\xd4\\xa4\\xbc\\xa4\\xbf\\xa4\\xbc\', 1)\n
Run Code Online (Sandbox Code Playgroud)\n\n

正如您所看到的,当我尝试解码B5 6E时出现错误,并euc_kr.codec.encode给出比我预期更长的字节。我不知道那里发生了什么。解码B5 6E时如何避免出现错误(以及许多其他韩语字符)是否有另一个关于 EUC-KR 规范的文档,我可以阅读它来了解 EUC-KR 的 python 实现如何工作?

\n

Mar*_*nen 5

看起来euc_kr结果是某种分解。你可以尝试一下cp949,根据维基百科

\n\n
\n

Windows 的默认韩语代码页(代码页 949)是 EUC-KR 的专有但向上兼容的扩展...

\n
\n\n

一些实验:

\n\n
>>> s = \'\xed\x83\x87\'\n>>> ud.name(s)\n\'HANGUL SYLLABLE TAD\'\n>>> s.encode(\'euc_kr\')\nb\'\\xa4\\xd4\\xa4\\xbc\\xa4\\xbf\\xa4\\xa7\'\n>>> s.encode(\'euc_kr\').decode(\'cp949\')\n\'\xe3\x85\xa4\xe3\x85\x8c\xe3\x85\x8f\xe3\x84\xb7\'\n>>> for c in s.encode(\'euc_kr\').decode(\'cp949\'):\n...     print(ud.name(c))\n...     \nHANGUL FILLER\nHANGUL LETTER THIEUTH\nHANGUL LETTER A\nHANGUL LETTER TIKEUT\n>>> s.encode(\'cp949\').hex()\n\'b56e\'\n
Run Code Online (Sandbox Code Playgroud)\n