it_*_*ure 2 unicode python-3.x
我在python3.3。
unicode 字符串和二进制字符串有什么区别?
b'\\u4f60'
u'\x4f\x60'
b'\x4f\x60'
u'4f60'
Run Code Online (Sandbox Code Playgroud)
Unicode 和二进制字符串的概念令人困惑。我怎样才能b'\\u4f60' 变成 b'\x4f\x60'?
首先 - python 3 中的 unicode 文字和字符串文字之间没有区别。它们是一样的 - 您可以预先删除u。只写字符串。因此,您应该立即看到文字u'4f60'就像编写实际的'4f60'.
一个bytes文字-又名b'some literal'-是一系列字节。32 到 127(又名 ASCII)之间的字节可以显示为其对应的字形,其余的显示为\x转义版本。不要被这个混淆 -b'\x61'与b'a'. 这只是印刷的问题。
字符串文字是字符串文字。它可以包含 unicode 代码点。在这里解释 unicode 的工作原理太多了,但基本上一个代码点代表一个字形(本质上,一个字符- 一个字母/数字的图形表示),它没有指定机器需要如何表示它。事实上,有很多不同的方式。
因此,bytes文字和str文字之间存在很大差异。前者描述机器表示,后者描述我们现在正在阅读的字母数字字形。两个域之间的映射是encoding/decoding。
我在这里跳过了很多重要信息。不过,这应该能让我们找到某个地方。我强烈建议阅读更多,因为这不是一个容易的话题。
我怎样才能
b'\\u4f60'变成b'\x4f\x60'?
让我们来看看它:
b'\u4f60'
Out[101]: b'\\u4f60' #note, unicode-escaped
b'\x4f\x60'
Out[102]: b'O`'
'\u4f60'
Out[103]: '?'
Run Code Online (Sandbox Code Playgroud)
所以,请注意\u4f60的是,汉象形文字字形。 \x4f\x60是,如果我们用 ascii(或 utf-8,实际上)表示它,字母 O ( \x4f) 后跟反引号。
我可以要求 python 将该 unicode 转义bytes序列转换为具有相应 unicode 字形的有效字符串:
b'\\u4f60'.decode('unicode-escape')
Out[112]: '?'
Run Code Online (Sandbox Code Playgroud)
所以现在我们需要做的就是重新转换encode为字节,对吗?好...
来到我认为你想问的问题 -
如何更改
'\\u4f60'为正确的字节表示?
该 unicode 代码点没有“正确”的字节表示。您想要的编码中只有一种表示形式。碰巧有一种编码直接匹配到b'\x4f\x60'-的转换utf-16be。
b'\\u4f60'.decode('unicode-escape').encode('utf-16-be')
Out[47]: 'O`'
Run Code Online (Sandbox Code Playgroud)
这样做的原因是它utf-16是一种可变长度编码。对于 16 位以下的代码点,它只是直接使用代码点作为 2 字节编码,而对于上面的点,它使用称为“代理对”的东西,我不会介绍。
| 归档时间: |
|
| 查看次数: |
2345 次 |
| 最近记录: |