我试图在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实现是如何工作的?
答案 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'