UTF8输入文字和Unicode点之间有什么区别?

dav*_*vid 6 python unicode utf-8 python-2.7

我遇到了一个显示Unicode表的网站

当我打印字母“ ???”时:

>>> x = '???'
>>> x
'\xd7\xa1\xd7\xa4\xd7\xa8'
Run Code Online (Sandbox Code Playgroud)

我得到这个角色'\xd7\xa1\xd7\xa4\xd7\xa8'

我认为python对单词'???'进行编码 使用utf-8 Unicode,因为它是默认设置,对吗?

但是当我运行这段代码时:

>>> x = u'???'
>>> x
u'\u05e1\u05e4\u05e8'
Run Code Online (Sandbox Code Playgroud)

我得到了u'\u05e1\u05e4\u05e8',这是Unicode点,对吗?

怎么把utf8-literal转换成Unicode点?

Mar*_*ers 5

@在第一个示例中,您创建了一个字节字符串(类型str)。您的终端确定了编码(在本例中为 UTF-8)。

在第二个示例中,您创建了一个 Unicode 字符串(类型unicode)。Python 自动检测您的终端使用的编码(来自sys.stdin.encoding)并将字节从 UTF-8 解码为 Unicode 代码点。

您可以通过解码进行从字节字符串到 Unicode 字符串的相同转换:

unicode_x = bytestring_x.decode('utf8')
Run Code Online (Sandbox Code Playgroud)

要走向另一个方向,您需要编码

bytestring_x = unicode_x.encode('utf8')
Run Code Online (Sandbox Code Playgroud)

您通过使用字符的实际 UTF-8 字节来指定文字;这在终端中运行良好,但在 Python 源代码中不起作用;Python 2 源代码仅作为 ASCII 文本加载。您可以通过设置源代码编码声明来更改此设置。这在PEP 263 中有规定;它必须是源文件中的第一行或第二行。例如:

# encoding: UTF-8
Run Code Online (Sandbox Code Playgroud)

或者您可以坚持使用\uhhhh\xhh转义序列来表示非 ASCII 字符。

您可能想了解 Unicode 和编码(二进制)字节字符串之间的区别,以及它们与 Python 的关系: