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

UTF-16 Encoding and Japanese in Python 3

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

例如,

'インスタントグラム' 

应该变成

'\u30a4\u30f3\u30b9\u30bf\u30f3\u30c8\u30b0\u30e9\u30e0'

我正在使用以下代码块:

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

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

b'\xff\xfe\xa40\xf30\xb90\xbf0\xf30\xc80\xb00\xe90\xe00'

知道我错过了什么吗?我试过其他编码,但没有任何效果。

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

您的预期输出不是 UTF-16。 UTF-16 是一个 encoding that uses 2 bytes per codepoint; , Unicode codepoint U+30A4 KATAKANA LETTER I, when represented in UTF-16 bytes as A4 30 or 30 A4 hexadecimal, depending on the byte order the encoder picked.

相反,您的预期输出包含嵌入 \u 转义符中的 Unicode 代码点。这种转义在多种上下文中使用,包括 Python 字符串文字和 JSON 数据。

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

>>> jp_example = 'インスタントグラム'
>>> import json
>>> print(json.dumps(jp_example))
"\u30a4\u30f3\u30b9\u30bf\u30f3\u30c8\u30b0\u30e9\u30e0"

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

将这些字节再次解码为文本
>>> print(jp_example.encode('unicode_escape').decode('ascii'))
\u30a4\u30f3\u30b9\u30bf\u30f3\u30c8\u30b0\u30e9\u30e0

您需要绝对确定您的数据的用途。 JSON 和 Python 字符串文字符号在涉及 Basic Multi-lingual Plane 之外的代码点时有所不同,例如大多数表情符号:

>>> print(json.dumps(''))
"\ud83d\udc31\ud83d\udc64"
>>> print(''.encode('unicode_escape').decode('ascii'))
\U0001f431\U0001f464

JSON 使用 surrogate pairs 来表示此类代码点,而 Python 使用 \Uhhhhhhhh 8 位十六进制数字转义序列。

明确地说:unicode-converter 站点生成的内容没有帮助,而且完全是误导。当您选中 Remove \u 框时,'UTF-16' 框会生成 JSON-notation 转义序列或 UTF-16 little-endian 十六进制值,没有字节顺序标记。 UTF-32 输出的 u+ 标记应该做什么我不太明白,UTF-8 框输出 UTF-8-to-Latin-1 Mojibake。我不会使用那个网站。