2017-10-10 45 views
1

unicode的这些不同类型的ascii表示的名称是什么?Python 2.7:unicode表示的名称

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

而且是有,他们属于这比“表示”更具体的设置期限?在这些背景下,我将如何描述非ascii表示()?

由于我不知道该怎么称呼他们,因此很难搜索如何与他们合作。

谢谢!

+1

这似乎是一个特定语言的问题,或者至少将有具体的语言回答。此外,在允许使用十六进制字节格式的情况下,不能将字节解释为Unicode。例如,在C#中不允许。在JavaScript中,它表示来自ISO 8859-1的字节,然后将其作为Unicode字符放入字符串中。 –

回答

1

正如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位十六进制值
  • 是一个字形或简单的特殊字符。
+1

第一个也是第二个UTF-8编码。 –

+2

范围'\ x00'到'\ x7f'之外的十六进制值不是ASCII。这不是一个16位的十六进制值,它是32位。技术术语是“代码点”,而不是“字符”。 –

+0

是的,我用十六进制数字混淆了十六进制值。 8位十六进制数字表示32位,你是对的,我编辑了答案。 –

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 。

我们可以确认,与其他语言不同,在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") 
+1

对'\ u'的处理可能取决于您使用的Python的版本和内部版本。对我来说,'u'\ ud83d \ ude22“== u'\ U0001f622''在2.7上产生'True',在3.6上产生'False'。 –