【问题标题】:What is the difference between UTF8-in literal and unicode point?UTF8-in 文字和 unicode 点有什么区别?
【发布时间】:2015-01-25 20:13:06
【问题描述】:

我遇到了这个website,它显示了 Unicode 表。

当我打印字母“ספר”时:

>>> x = 'ספר'
>>> x
'\xd7\xa1\xd7\xa4\xd7\xa8'

我得到了这个字符'\xd7\xa1\xd7\xa4\xd7\xa8'

我认为 python 用 utf-8 Unicode 编码单词“ספר”,因为它是默认值,对吧?

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

>>> x = u'ספר'
>>> x
u'\u05e1\u05e4\u05e8'

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

如何从 utf8-literal 转换为 Unicode 点?

【问题讨论】:

  • 注意字节串(上面的第一个x赋值)和Unicode点串(第二个x赋值)对于UTF-8中的符号是等价的:@ 987654322@

标签: python python-2.7 unicode utf-8


【解决方案1】:

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

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

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

unicode_x = bytestring_x.decode('utf8')

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

bytestring_x = unicode_x.encode('utf8')

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

# encoding: UTF-8

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

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

【讨论】:

  • unicode字符串和字节字符串有什么区别?
  • @david:不同的对象,一个代表字节(0 到 255 之间的整数值被解释为 ASCII 文本),其他的 Unicode 代码点。
  • @david:我提供了一些规范链接供您学习 Unicode 和编码字节字符串; Unicode 是比编码字节更接近的文本表示;就像您可以使用datetime.datetime() 非常接近地模拟日期和时间一样,您也可以在文本中以不同方式表示该日期时间组合(ISO 8601 是 2014-11-27T09:42:20+00:00,但您也可以写 2014 年 11 月 27 日星期四,早上 18 分钟到 9 点,忽略秒数和时区); datetime.datetime() 对象比文本版本更接近地模拟信息。
  • 感谢您的回答,“您可以坚持使用 \uhhh 和 \xhh ”是什么意思?你的意思是我可以用文字写 utf-8 而不是使用编码 UTF-8,它会正常工作吗?
  • @david:你可以在值表示中看到那些; \uhhhh 允许您以十六进制表示法指定一个 Unicode 代码点,\xhh 允许您以十六进制表示法指定一个字节。后者也适用于在 ASCII 和 Latin-1 范围内指定 Unicode 代码点(因为它们的值 String Literals documentation。
猜你喜欢
  • 2013-02-27
  • 1970-01-01
  • 2019-04-05
  • 2013-01-11
  • 2015-07-16
相关资源
最近更新 更多