我有utf-16字符串\u0423\u043a\u0440\u0430\u0438\u043d\u0430.这编码了Украина,您可以使用任何在线utf16解码器来验证它。
但试图在python中对其进行解码:
print(b"\u0423\u043a\u0440\u0430\u0438\u043d\u0430".decode('utf16'))产出:畜㐰㌲畜㐰愳畜㐰〴畜㐰〳畜㐰㠳畜㐰搳畜㐰〳
为什么?
发布于 2022-01-17 03:46:57
这不是一个"utf-16“字符串,它只是一个普通的unicode转义字符串。print("\u0423\u043a\u0440\u0430\u0438\u043d\u0430")输出正确的输出,而不需要对任何内容进行解码。
但是,如果您实际上有一个字节为"\“、"u”、"0“、"4”等字节的字节,请使用print(b"\u0423\u043a\u0440\u0430\u0438\u043d\u0430".decode("unicode-escape"))。
发布于 2022-01-17 04:13:40
如果您有"\u0423\u043a\u0440\u0430\u0438\u043d\u0430",那么这并不是“编码”Украина;它等于Украина。它不是“utf-16字符串”,而是字符串。没有“{编码}字符串的名称”这样的东西。
有“使用字节编码字符串的字节”。bytes对象不是文本。字符串不是字节序列。它们不是有意义的相关类型,只是因为遗留的原因(老实说,相对不幸的原因;第一个Unicode标准比现在更接近于第一个ASCII标准)。因此,bytes对象的字面语法以及它们的规范repr是相当不幸的;但这正是我们必须面对的。
如果您有b"\u0423\u043a\u0440\u0430\u0438\u043d\u0430",那么您就有一个使用文字创建的bytes对象。bytes的字面语法没有为\u转义指定任何特定的含义。u in \u表示Unicode。在字符串中,该序列表示Unicode代码点。bytes对象不能包含这些--它们包含字节--因此它们没有理由支持转义序列。与往常一样,对于Python用引号括起来的东西,反斜杠后面跟着没有特殊意义的东西,只是一个反斜杠(尽管通常应该加倍反斜杠来转义它们)。当然,在bytes中,反斜杠符号并不表示反斜杠文本字符,因为bytes对象不存储文本。相反,由于这些历史原因,它代表了积分值92。
如果要创建一个bytes对象,该对象包含以UTF-16编码表示字符串的字节,那么:
bytes文本语法表示它,并使用\x转义序列表示(回退、小写x和两个十六进制数字)。(或使用相应的ASCII字符(如适用)。bytes构造函数。如果您想从表示UTF-16字符串的文件中读取字节,假设您知道endianness,那么它很简单:
.decode对象的bytes方法。如果您有b"\u0423\u043a\u0440\u0430\u0438\u043d\u0430",并希望将其视为"\u0423\u043a\u0440\u0430\u0438\u043d\u0430";由于某些原因,您无法修复给您提供此错误输入的进程,那么这就是unicode-escape编解码器的用途。
https://stackoverflow.com/questions/70736283
复制相似问题