【问题标题】:Python encodes (Korean) characters in an unexpected way with euc-kr encoding (codecs, encodings module)Python 使用 euc-kr 编码(编解码器、编码模块)以一种意想不到的方式对(韩语)字符进行编码
【发布时间】:2018-03-27 22:16:00
【问题描述】:

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

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

# 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 实现如何工作?

【问题讨论】:

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

标签: python unicode encoding character-encoding


【解决方案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'

【讨论】:

  • 非常感谢。我现在一切都清楚了。供您参考,每个韩语字符都由 chosung、joongsung(和 jongsung 可选)组成,但语法不允许这三者的所有可能组合。例如在 '탓' 和 '탇' 中,韩文语法只允许 '탓' 作为有效的韩文字符。但在某些情况下,允许使用不规则的韩语字符,例如发音符号。实际上,在发音符号系统中,“탓”是无效的,但“탇”是有效的。
猜你喜欢
  • 2018-01-13
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多