这些不同种类的unicode ascii表示的名称是什么?
\xF0\x9F\x98\xA2
\U0001f622
他们所属的集合中是否有一个术语比“表示”更具体?在这些情况下,我将如何描述非ascii表示()?
由于我不知道该怎么称呼它们,因此很难找到如何使用它们。
谢谢!
答案 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")