我有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
编解码器就是这么做的。