Python 2.7:unicode表示的名称

时间:2017-10-10 20:53:14

标签: python unicode utf-8 unicode-escapes unicode-literals

这些不同种类的unicode ascii表示的名称是什么?

  • \xF0\x9F\x98\xA2
  • \U0001f622

他们所属的集合中是否有一个术语比“表示”更具体?在这些情况下,我将如何描述非ascii表示()?

由于我不知道该怎么称呼它们,因此很难找到如何使用它们。

谢谢!

2 个答案:

答案 0 :(得分:1)

正如Tom Blodget已经警告过你,这是一个特定的python特定答案。

前导\表示它是一个转义序列。

\x表示接下来的两个字符将被解释为十六进制数字。

\U表示接下来的八个字符将被解释为32位十六进制值。

您可以在此处详细了解:

  

https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals

完全回答你的问题:

  • \xF0\x9F\x98\xA2只是四个ASCII字符,你有十六进制值
  • \U0001f622是使用32位十六进制值编码的UNICODE代码点
  • 是一个字形或只是一个特殊字符。

答案 1 :(得分:1)

对于Python 3

首先,似乎存在关于十字转义的误解:

print("\xF0\x9F\x98\xA2" == "\u00F0\u009F\u0098\u00A2")
print("\xF0\x9F\x98\xA2" == "\U000000F0\U0000009F\U00000098\U000000A2")
print("\xF0\x9F\x98\xA2" == "\U000000F0\U0000009F\U00000098\U000000A2")
print("\xF0\x9F\x98\xA2" == "\N{LATIN SMALL LETTER ETH}\N{APPLICATION PROGRAM COMMAND}\N{START OF STRING}\N{CENT SIGN}")

并且为了完整性(我记得在机器代码中有效使用八进制,其中一些指令有3位对齐的参数,但我没有看到实际编程中的重点):

print("\xF0\x9F\x98\xA2" == "\360\237\230\242")

它们似乎都是Unicode 代码点转义为2位十六进制,4位十六进制和8位十六进制,范围从U + 0000到U + 00FF,U + FFFF,和U + 10FFFF。

我们可以确认,与其他语言不同的是,\ u for是UTF-16代码单元,在Python 3中,它实际上是一个代码点。

print("\ud83d\ude22" == "\U0000d83d\U0000de22")

并且为了完整性:

print("\U0001f622" == "")
print("\N{CRYING FACE}" == "")

在其他语言(它们是两个UTF-16代码单元)中,"\ud83d\ude22"等于""

现在,U + D8ED和U + DE22是指定为代理的Unicode代码点。换句话说,不是字符。它们为具有相应值的UTF-16代码单元保留代码点代码空间。当Unicode从2 ^ 16个代码点扩展到2 ^ 21个代码点时,这就是将USC-2编码的Unicode透明地扩展到UTF-16的方式。有关详细信息,请参阅Unicode FAQ

正如@Robᵩ指出的那样,你也可以有一个bytestring文字:

print("\U0001f622".encode("utf-8") == b"\xF0\x9F\x98\xA2")