首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解码(‘utf-16’)不能正确解码。

解码(‘utf-16’)不能正确解码。
EN

Stack Overflow用户
提问于 2022-01-17 03:42:37
回答 2查看 164关注 0票数 0

我有utf-16字符串\u0423\u043a\u0440\u0430\u0438\u043d\u0430.这编码了Украина,您可以使用任何在线utf16解码器来验证它。

但试图在python中对其进行解码:

代码语言:javascript
复制
print(b"\u0423\u043a\u0440\u0430\u0438\u043d\u0430".decode('utf16'))

产出:畜㐰㌲畜㐰愳畜㐰〴畜㐰〳畜㐰㠳畜㐰搳畜㐰〳

为什么?

EN

回答 2

Stack Overflow用户

发布于 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"))

票数 4
EN

Stack Overflow用户

发布于 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编码表示字符串的字节,那么:

  • 确定你是指UTF-16-LE还是UTF-16-BE。选择是必要的。
  • 对于字符串的每个Unicode代码点,如果它位于基本多语言平面中,则查找相应的16位值;对于其他字符,则使用两个这样的值的代孕对
  • 对于每个16位值,将其表示为两个字节,顺序由所需的endianness (-LE或-BE)确定。
  • 对于每个字节,用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编解码器的用途。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70736283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档