解码('UTF-16') 无法正确解码

  • 本文关键字:解码 UTF-16 python
  • 更新时间 :
  • 英文 :


我有utf-16字符串u0423u043au0440u0430u0438u043du0430。这对Украина进行编码,您可以使用任何在线utf16解码器进行验证。

但试图在python中解码:

print(b"u0423u043au0440u0430u0438u043du0430".decode('utf16'))

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

为什么?

这不是一个"utf-16";字符串,它只是一个普通的unicode转义字符串。print("u0423u043au0440u0430u0438u043du0430")打印出正确的输出,而不需要解码任何内容。

然而,如果您实际上有一个带有文字字节"的字节串\&"u"0"4〃;,由于某种原因而使用CCD_。

如果你有"u0423u043au0440u0430u0438u043du0430",那么它就不会"编码";Украина;其等于CCD_ 8。它不是";一个utf-16串";;它是一个字符串。不存在"这样的东西;{编码的名称}字符串";。

";使用";。bytes对象不是文本。字符串不是字节序列。它们并不是有意义的相关类型,似乎只是出于遗留的原因(老实说,这是相对不幸的原因;第一个Unicode标准在时间上比今天更接近第一个ASCII标准。(因此,bytes对象及其规范repr的字面语法是相当不幸的;但这就是我们必须面对的。

如果您有b"u0423u043au0440u0430u0438u043du0430",那么您就有一个使用文字创建的bytes对象。bytes的字面语法没有为u转义指定任何特定的含义。u中的u代表Unicode。在字符串中,该序列表示Unicode代码点。bytes对象不能包含这些-它们包含字节-因此它们没有理由支持转义序列。对于Python用引号括起来的东西,通常情况下,后面跟着没有特殊含义的反斜杠只是一个反斜杠(尽管通常应该将反斜杠加倍以转义它们(。当然,在bytes中,反斜杠符号并不代表反斜杠文本字符,因为bytes对象不存储文本。相反,由于这些历史原因,它表示积分值92。

如果您想创建一个bytes对象,该对象包含表示UTF-16编码字符串的字节,那么:

  • 确定您实际指的是UTF-16-LE还是UTF-16-BE。选择是必要的
  • 对于字符串的每个Unicode代码点,如果它在基本多语言平面中,则找到相应的16位值;对于其他字符,请使用两个此类值的代理项对
  • 对于每个16位的值,将其表示为两个字节,其顺序由所需的字节序(-LE或-BE(确定
  • 对于这些字节中的每一个,用x转义序列(反冲、小写x和两个十六进制数字(在bytes文本语法中表示它。(如果适用,也可以使用相应的ASCII字符
  • 或者,创建字节值的列表(或其他可迭代的(,并将其传递给bytes构造函数

如果您想从代表UTF-16字符串的文件中读取字节,假设您知道endianness,那么很简单:

  • 以二进制模式打开文件,读取任意数量的字节
  • 要获取相应的字符串,请使用bytes对象的.decode方法

如果您有b"u0423u043au0440u0430u0438u043du0430"并希望将其视为"u0423u043au0440u0430u0438u043du0430";由于某种原因,你无法修复给你这个错误输入的过程,那么unicode-escape编解码器就是这么做的。

最新更新