Python '☃';。编码(“utf-8”)不同于ord(“x27”和“x2603”和“x27”)

Python '☃';。编码(“utf-8”)不同于ord(“x27”和“x2603”和“x27”),python,Python,我测试了以下unicode: In [34]: snowman = "\u2603" In [35]: snowman Out[35]: '☃' 雪人编码 In [36]: ds = snowman.encode("utf-8") In [37]: ds Out[37]: b'\xe2\x98\x83' 但是,当我用ord()检查它时 与b'\xe2\x98\x83'不同 我怎么能理解它呢?返回一个Unicode码点--- 标识给定字符的任意数字 返回以某种编码表示给定字符串的字节序列。。

我测试了以下unicode:

In [34]: snowman = "\u2603"
In [35]: snowman
Out[35]: '☃'
雪人编码

In [36]: ds = snowman.encode("utf-8")
In [37]: ds
Out[37]: b'\xe2\x98\x83'
但是,当我用ord()检查它时

与b'\xe2\x98\x83'不同

我怎么能理解它呢?

返回一个Unicode码点--- 标识给定字符的任意数字

返回以某种编码表示给定字符串的字节序列。。。 如果字符串可以用该编码表示

编码和代码点仅在它们都标识相同字符的意义上相关

Ned Batchelder对字节和字符之间的差异做了一个很好的介绍 "" (36分钟)。
他介绍了Python2和Python3,以及它们解决这个问题所采用的截然不同的方法。

但是为什么您会期望它们是相同的呢?它们做不同的事情。
hex(9731)
equals
'0x2603'
。为了echo@unutbu,hex 9731==unicode 2603==bytes\xe2\x98\x83UTF-8的设计使得1)代码点0-127使用单字节表示,与ASCII中相同;2)任何多字节字符都使用大于128的字节表示。(这允许轻松检测非ASCII字符,并确保如果去除所有字符>128,则不会去除部分字符。)这是Unicode编码,但它本身不是Unicode。它是Unicode到字节流的映射。会有不同。如果您想要代码点到字节的精确映射,请尝试UTF-32。
In [38]: ord('☃')
Out[38]: 9731