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

3

我正在使用Python3.3。

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

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

Unicode和二进制字符串的概念很令人困惑。如何将b'\\u4f60'转换为b'\x4f\x60'
1个回答

6
在Python 3中,Unicode字面量和字符串字面量没有区别。它们是一样的-您可以省略前面的“u”。只需编写字符串即可。因此,您应该立即看到文字“u'4f60'”就像编写实际的“'4f60'”一样。
一个“bytes”字面量-也称为“b'some literal'”-是一系列字节。32到127之间(即ASCII)的字节可以显示为它们对应的图形符号,其余部分则显示为“\x”转义版本。不要被这个混淆了-“b'\x61'”与“b'a'”相同。这只是打印问题。
字符串字面量是字符串字面量。它可以包含Unicode代码点。在这里解释Unicode工作的细节太多了,但基本上代码点表示一个“glyph”(本质上是一个“character”-一个字母/数字的图形表示),它不指定机器需要如何表示它。实际上有很多不同的方法。
因此,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位以上的代码点,则使用称为“代理对”的东西,我不会深入讲解。

想到Roippi,它可以增强我的编程技巧,将b'\u4f60'转换为b'\x4f\x60',我该怎么做? - showkey
b'\\u4f60'.decode('unicode-escape').encode('utf-16be') == b'\x4f\x60' - jfs
@J.F.Sebastian 嗯,我要修改一下(噫,没有考虑代理对)。 - roippi
你可以把Unicode代码点称为“字符”。虽然不太精确,但至少提供了一些直觉。 “字形”可能会让它听起来比实际更正式。例如,代码点的具体示例,如'\u0061' == 'a''\N{LATIN SMALL LETTER B}' == '\u0062' == 'b',以及'\N{snowman}' == '\u2603' == '☃''\U0001F382' == '\N{BIRTHDAY CAKE}'也可能有所帮助。 - jfs
有用的提示。我将努力使其更易于理解。 - roippi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接