Python使用euc-kr编码以意外的方式编码(韩语)字符(编解码器,编码模块)

时间:2017-10-16 11:42:54

标签: python unicode encoding character-encoding

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

韩语字符(这是一个很少使用的字符,但我需要这个用于发音字典)应根据EUC-KR规范编码为 B5 6E (我提到this site)。但编码模块给了我一些不同的结果。

# python3
>> from encodings import euc_kr
>> euc_kr.codec.decode(b'\xB5\x6E')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'euc_kr' codec cant decode byte 0xb5 in position 0: illegal multibyte sequence
>> euc_kr.codec.encode('탙')
(b'\xa4\xd4\xa4\xbc\xa4\xbf\xa4\xbc', 1)

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

1 个答案:

答案 0 :(得分:1)

看起来euc_kr结果是某种分解。您可以尝试cp949,根据Wikipedia

  

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

一些实验:

>>> s = '탇'
>>> ud.name(s)
'HANGUL SYLLABLE TAD'
>>> s.encode('euc_kr')
b'\xa4\xd4\xa4\xbc\xa4\xbf\xa4\xa7'
>>> s.encode('euc_kr').decode('cp949')
'ㅤㅌㅏㄷ'
>>> for c in s.encode('euc_kr').decode('cp949'):
...     print(ud.name(c))
...     
HANGUL FILLER
HANGUL LETTER THIEUTH
HANGUL LETTER A
HANGUL LETTER TIKEUT
>>> s.encode('cp949').hex()
'b56e'