unicode的这些不同类型的ascii表示的名称是什么?Python 2.7:unicode表示的名称
\xF0\x9F\x98\xA2
\U0001f622
而且是有,他们属于这比“表示”更具体的设置期限?在这些背景下,我将如何描述非ascii表示()?
由于我不知道该怎么称呼他们,因此很难搜索如何与他们合作。
谢谢!
unicode的这些不同类型的ascii表示的名称是什么?Python 2.7:unicode表示的名称
\xF0\x9F\x98\xA2
\U0001f622
而且是有,他们属于这比“表示”更具体的设置期限?在这些背景下,我将如何描述非ascii表示()?
由于我不知道该怎么称呼他们,因此很难搜索如何与他们合作。
谢谢!
正如Tom Blodget已经警告过你,这是一个有点python的具体答案。
前导\
表明它是一个转义序列。
\x
表示接下来的两个字符将被解释为十六进制数字。
\U
表示接下来的八个字符将被解释为一个32位的十六进制值。
你可以阅读更多有关在这里:
https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals
要完全回答你的问题:
\xF0\x9F\x98\xA2
只是1-4个ASII码,你有自己的十六进制值\U0001f622
是UNICODE编码点编码用32位十六进制值
是一个字形或简单的特殊字符。第一个也是第二个UTF-8编码。 –
范围'\ x00'到'\ x7f'之外的十六进制值不是ASCII。这不是一个16位的十六进制值,它是32位。技术术语是“代码点”,而不是“字符”。 –
是的,我用十六进制数字混淆了十六进制值。 8位十六进制数字表示32位,你是对的,我编辑了答案。 –
对于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 。
我们可以确认,与其他语言不同,在Python 3中,\ u for代表UTF-16代码单元,它确实是一个代码点。
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码点时,这种方式将Unicode的USC-2编码透明地扩展到UTF-16。欲了解更多信息,请参阅Unicode FAQ。
由于@Robᵩ指出,你可以有一个字节字符串字面,太:
print("\U0001f622".encode("utf-8") == b"\xF0\x9F\x98\xA2")
对'\ u'的处理可能取决于您使用的Python的版本和内部版本。对我来说,'u'\ ud83d \ ude22“== u'\ U0001f622''在2.7上产生'True',在3.6上产生'False'。 –
这似乎是一个特定语言的问题,或者至少将有具体的语言回答。此外,在允许使用十六进制字节格式的情况下,不能将字节解释为Unicode。例如,在C#中不允许。在JavaScript中,它表示来自ISO 8859-1的字节,然后将其作为Unicode字符放入字符串中。 –