unicode和二进制字符串有什么区别?

时间:2014-03-27 02:34:19

标签: python-3.x unicode

我在python3.3中。

unicode字符串和二进制字符串有什么区别?

b'\\u4f60'
u'\x4f\x60'
b'\x4f\x60'
u'4f60'

Unicode和二进制字符串的概念令人困惑。如何将b'\\u4f60'更改为b'\x4f\x60'

1 个答案:

答案 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字节编码,对于上面的点,它使用称为"代理对"的东西,我不会进入。