我正在尝试使用 python 3.10 中的字符串编码,特别是为了演示 yen/won/backslash 编码问题。
所以以下行为(不可逆映射)对我来说很有意义:
>>> "¥".encode("shift-jis").decode("shift-jis")
'\\'
我还可以用我的 iconv 副本进行验证:
$ echo -n "¥" | iconv -f utf-8 -t shift-jis | hexdump
0000000 005c
0000001
现在我很难理解以下行为:
>>> "₩".encode("euc-kr")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'euc_kr' codec can't encode character '\u20a9' in position 0: illegal multibyte sequence
同时:
$ echo -n "₩" | hexdump
0000000 82e2 00a9
0000003
$ echo -n "₩" | iconv -f utf-8 -t euc-kr | hexdump
0000000 dca3
0000002
$ echo -n "₩" | iconv -f utf-8 -t euc-kr | iconv -f euc-kr -t utf-8 | hexdump
0000000 bfef 00a6
0000003
我对KS X 1001(注册为ISO-IR 149)的天真的理解是,
₩
真的是\
(*):
KS X 1001 的编码方案包括 EUC-KR(ASCII 和 ISO 基于 646-KR 的变体,后者包括韩元货币 字节 0x5C 处的符号 (₩) 而不是反斜杠)
我对
KS X 1001
和₩
有什么误解?
\
符号?dca3
(U+20A9,WON SIGN)返回代码 ₩
(U+FFE6 FULLWIDTH WON SIGN)?供参考:
$ python3 --version
Python 3.10.12
和
$ iconv --version
iconv (Ubuntu GLIBC 2.35-0ubuntu3.6) 2.35
问题是 Unicode 有两个韩元符号:U+20A9 韩元符号和U+FFE6 全角韩元符号。 Python 已经实现了全角版本,但您正在测试另一个版本。他们这样做可能正是为了避免您正在测试的问题。这很好用:
"\uffe6".encode("euc-kr")
b'\xa3\xdc'