对于 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 codepoint 以 2 位十六进制、4 位十六进制和 8 位十六进制转义,范围从 U+0000 到 U+00FF、U+FFFF、和 U+10FFFF,分别。
我们可以确认,与 \u 表示 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 个码点时,这就是 Unicode 的 USC-2 编码透明地扩展到 UTF-16 的方式。如需更多信息,请参阅Unicode FAQ。
正如@Robᵩ 指出的那样,你也可以有一个字节串文字:
print("\U0001f622".encode("utf-8") == b"\xF0\x9F\x98\xA2")