2017-10-16 60 views
0

我尝试读取python中'euc-kr'编码的一些韩文文件,但是出现了一些错误。在对encodings模块进行了一段时间的检查之后,我了解到这个模块对韩文字符的编码看起来很奇怪。让我举一个例子Python用euc-kr编码(编解码器,编码模块)以意想不到的方式编码(韩文)字符

韩文字符(这是一个很少使用的字符,但我需要这个发音)应该根据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 6Eeuc_kr.codec.encode给我,比我预期的要长字节。我不知道那里发生了什么。当我解码B5 6E(以及许多其他韩语字符)时,如何避免产生错误?有没有关于EUC-KR规范的另一个文档,我可以阅读它以了解EUC-KR的python实现如何工作?

+1

是的,那很奇怪。我不熟悉euc编码,但我不明白为什么'euc_kr.codec.encode('탙')'产生这么多的字节,当euc_kr应该用1或2个字节编码每个代码点。顺便说一句,你不需要使用'euc_kr.codec.encode(s)',你可以做's.encode('euc_kr')'。 –

回答

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' 
+1

非常感谢。现在一切都很清楚。为了您的信息,每个韩文字符由chosung,joongsung(和jongsung可选)组成,但是语法不允许这三种可能的组合。例如在'탓'和'탇'中,韩语语法只允许'탓'作为有效的韩语字符。 但有些情况下可以使用不规则的韩文字符,如发音符号。实际上,在发音符号系统中,'탓'无效,但'탇'是。 –

相关问题