我在python3.3中。
unicode字符串和二进制字符串有什么区别?
b'\\u4f60'
u'\x4f\x60'
b'\x4f\x60'
u'4f60'
Unicode和二进制字符串的概念令人困惑。如何将b'\\u4f60'
更改为b'\x4f\x60'
?
答案 0 :(得分:3)
首先 - 在python 3中,unicode文字和字符串文字没有区别。它们是同一个 - 你可以放弃u
。只需写字符串。所以你应该立即看到文字u'4f60'
就像写实际的'4f60'
。
bytes
文字 - 又名b'some literal'
- 是一系列字节。 32到127之间的字节(也称为ASCII)可以显示为相应的字形,其余字节显示为\x
转义版本。不要对此感到困惑 - b'\x61'
与b'a'
相同。这只是印刷问题。
字符串文字是字符串文字。它可以包含unicode代码点。解释unicode如何在这里工作有很多东西,但基本上代码点代表字形(本质上,字符 - 字母/数字的图形表示) ,它没有指定机器如何表示它。事实上,有很多不同的方式。
因此bytes
文字与str
文字之间存在很大差异。前者描述了机器表示,后者描述了我们现在正在阅读的字母数字字形。两个域之间的映射是编码/解码。
我在这里跳过很多重要信息。这应该让我们在某个地方。我强烈推荐reading more,因为这不是一个简单的话题。
如何将
b'\\u4f60'
更改为b'\x4f\x60'
?
让我们来看看它:
b'\u4f60'
Out[101]: b'\\u4f60' #note, unicode-escaped
b'\x4f\x60'
Out[102]: b'O`'
'\u4f60'
Out[103]: '你'
所以,请注意\u4f60
是汉ideograph字形。 \x4f\x60
是,如果我们用ascii(或实际上是utf-8)表示它,则字母O(\x4f
)后跟反引号。
我可以让python将该unicode-escaped bytes
序列转换为带有相应unicode字形的有效字符串:
b'\\u4f60'.decode('unicode-escape')
Out[112]: '你'
所以现在我们需要做的就是重新encode
到字节,对吧?嗯......
来到我想想你想要问的地方 -
如何将
'\\u4f60'
更改为正确的字节表示?
没有'适当的'该unicode代码点的字节表示。编码中只有一种表示形式。碰巧有一种编码直接匹配转化为b'\x4f\x60'
- utf-16be
。
b'\\u4f60'.decode('unicode-escape').encode('utf-16-be')
Out[47]: 'O`'
这可行的原因是utf-16
是可变长度编码。对于低于16位的代码点,它只是直接使用代码点作为2字节编码,对于上面的点,它使用称为"代理对"的东西,我不会进入。