我正在使用Python3.3。
Unicode字符串和二进制字符串有什么区别?
b'\\u4f60'
u'\x4f\x60'
b'\x4f\x60'
u'4f60'
Unicode和二进制字符串的概念很令人困惑。如何将
b'\\u4f60'
转换为b'\x4f\x60'
?我正在使用Python3.3。
Unicode字符串和二进制字符串有什么区别?
b'\\u4f60'
u'\x4f\x60'
b'\x4f\x60'
u'4f60'
b'\\u4f60'
转换为b'\x4f\x60'
?bytes
字面量和str
字面量之间存在非常大的区别。前者描述了机器表示,后者描述了我们正在阅读的字母数字字符。两个域之间的映射是编码/解码。在这里我跳过了很多重要信息。虽然这不是一个容易的主题,但我强烈建议阅读更多。
如何将
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 的字形。如果我们用 ascii(或者实际上是 utf-8)表示,\x4f\x60
代表的是字母 O (\x4f
) 后面跟着一个反引号。我可以请求 Python 将这个 Unicode 转义的 bytes
序列转换为相应的 Unicode 字形的有效字符串:
b'\\u4f60'.decode('unicode-escape')
Out[112]: '你'
回到我认为你想要问的问题 -
如何将
'\\u4f60'
更改为其正确的字节表示形式?
该Unicode代码点没有“正确”的字节表示形式。只有您想要的编码中的表示形式。恰好有一种编码直接匹配转换为 b'\x4f\x60'
- utf-16be
。
b'\\u4f60'.decode('unicode-escape').encode('utf-16-be')
Out[47]: 'O`'
utf-16
是一种可变长度编码。对于16位以下的代码点,它直接使用该代码点作为2字节编码;而对于16位以上的代码点,则使用称为“代理对”的东西,我不会深入讲解。
b'\\u4f60'.decode('unicode-escape').encode('utf-16be') == b'\x4f\x60'
- jfs'\u0061' == 'a'
,'\N{LATIN SMALL LETTER B}' == '\u0062' == 'b'
,以及'\N{snowman}' == '\u2603' == '☃'
或'\U0001F382' == '\N{BIRTHDAY CAKE}'
也可能有所帮助。 - jfs