Python 2.7:unicode 表示的名称
Python 2.7: Names of unicode representations
unicode 的这些不同类型的 ascii 表示形式的名称是什么?
\xF0\x9F\x98\xA2
\U0001f622
他们所属的集合是否有比 "representation" 更具体的术语?在这些上下文中,我将如何描述非 ascii 表示 ()?
因为我不知道如何称呼它们,所以很难搜索如何使用它们。
谢谢!
正如 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 代码点
是字形或简单的特殊字符。
为Python3
首先似乎对十六进制转义存在误解:
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" == "0702")
好像都是Unicode codepoint转码,2位16进制,4位16进制,8位16进制,范围从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编码单元保留了相应值的codepoint编码空间。这是当 Unicode 从 2^16 个代码点扩展到 2^21 个代码点时,Unicode 的 USC-2 编码透明地扩展到 UTF-16 的方式。有关详细信息,请参阅 Unicode FAQ.
正如 @Robᵩ 指出的那样,您也可以使用字节串文字:
print("\U0001f622".encode("utf-8") == b"\xF0\x9F\x98\xA2")
unicode 的这些不同类型的 ascii 表示形式的名称是什么?
\xF0\x9F\x98\xA2
\U0001f622
他们所属的集合是否有比 "representation" 更具体的术语?在这些上下文中,我将如何描述非 ascii 表示 ()?
因为我不知道如何称呼它们,所以很难搜索如何使用它们。
谢谢!
正如 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 代码点
是字形或简单的特殊字符。
为Python3
首先似乎对十六进制转义存在误解:
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" == "0702")
好像都是Unicode codepoint转码,2位16进制,4位16进制,8位16进制,范围从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编码单元保留了相应值的codepoint编码空间。这是当 Unicode 从 2^16 个代码点扩展到 2^21 个代码点时,Unicode 的 USC-2 编码透明地扩展到 UTF-16 的方式。有关详细信息,请参阅 Unicode FAQ.
正如 @Robᵩ 指出的那样,您也可以使用字节串文字:
print("\U0001f622".encode("utf-8") == b"\xF0\x9F\x98\xA2")