Python 3 中的 UTF-16 编码和日语



我正在尝试将日语字符编码为UTF-16;基本上模仿这个在线工具的功能:https://www.branah.com/unicode-converter

例如

'インスタントグラム' 

应该成为

'u30a4u30f3u30b9u30bfu30f3u30c8u30b0u30e9u30e0'

我正在使用以下代码块:

jp_example = 'インスタントグラム'
jp_example.encode('utf-16')

而是接收如下所示的输出:

b'xffxfexa40xf30xb90xbf0xf30xc80xb00xe90xe00'

知道我错过了什么吗?我玩过其他编码,但对我没有任何用处。

FWIW,我正在使用带有Python 3.6.3rc1+的Jupyter Notebook。

您的预期输出不是 UTF-16。UTF-16 是一种编码,每个代码点使用 2 个字节;,Unicode 代码点 U+30A4 片假名字母 I,当用 UTF-16 字节表示为 A4 30 或 30 A4 十六进制时,具体取决于编码器选择的字节顺序。

相反,预期的输出由嵌入在u转义中的 Unicode 代码点组成。此类转义用于多个上下文,包括 Python 字符串文本和 JSON 数据。

如果要生成 JSON 数据,请使用json.dumps()创建 JSON 字符串;该字符串中 ASCII 字符集之外的任何代码点都用uhhhh转义序列表示:

>>> jp_example = 'インスタントグラム'
>>> import json
>>> print(json.dumps(jp_example))
"u30a4u30f3u30b9u30bfu30f3u30c8u30b0u30e9u30e0"

否则,如果要生成 Python 字符串文字,请使用unicode_escape编解码器;这也输出一个字节序列;出于打印目的,我使用 ASCII 编解码器将这些字节再次解码为文本。

>>> print(jp_example.encode('unicode_escape').decode('ascii'))
u30a4u30f3u30b9u30bfu30f3u30c8u30b0u30e9u30e0

您需要绝对确定数据的用途。JSON 和 Python 字符串文字表示法在涉及基本多语言平面之外的代码点时有所不同,例如大多数表情符号:

>>> print(json.dumps('🐱👤'))
"ud83dudc31ud83dudc64"
>>> print('🐱👤'.encode('unicode_escape').decode('ascii'))
U0001f431U0001f464

JSON 使用代理项对来表示此类代码点,而 Python 使用Uhhhhhhhh8 位十六进制转义序列。

明确地说:Unicode转换器网站产生的东西没有帮助,而且完全具有误导性。当您选中">删除\u"框时,"UTF-16"框会生成 JSON 表示法转义序列或 UTF-16 小端十六进制值,不带字节顺序标记。UTF-32 输出的u+标记应该做什么我不太明白,UTF-8 框输出 UTF-8 到拉丁语 1 Mojibake。我不会使用那个网站。

最新更新