如何在Python3中为相同的unicode解释不同的长度

如何在Python3中为相同的unicode解释不同的长度,python,unicode,Python,Unicode,我试图理解同一个unicode字符及其字节对象的不同长度的含义 我知道第一个长度(Len1)是单个unicode字符的实际长度,第二个长度(Len2)可能是单个unicode字符占用的总字节数,但其他剩余长度(Len3和Len4)代表什么?。我正在使用python 3 MyStr = '✮' print(MyStr," Len1 = ", len(MyStr)) print(bytes(MyStr, 'utf-8'), Len2 = ", len(bytes(MyStr, 'utf-8')))

我试图理解同一个unicode字符及其字节对象的不同长度的含义

我知道第一个长度(Len1)是单个unicode字符的实际长度,第二个长度(Len2)可能是单个unicode字符占用的总字节数,但其他剩余长度(Len3和Len4)代表什么?。我正在使用python 3

MyStr = '✮'
print(MyStr," Len1 = ", len(MyStr))
print(bytes(MyStr, 'utf-8'), Len2 = ", len(bytes(MyStr, 'utf-8')))
print(MyStr.encode('unicode_escape'), " Len3 = ", len(MyStr.encode('unicode_escape')))
print(ascii(MyStr), " Len4 = ", len(ascii(MyStr)))
这是输出

✮  Len1 =  1
b'\xe2\x9c\xae'  Len2 =  3
b'\\u272e'  Len3 =  6
'\u272e'  Len4 =  8

特定Unicode字符的字节表示长度取决于您如何表示它、字符是什么以及是否计算引号

你的角色”✮" 需要将三个字节表示为UTF-8字节流。更常见的“*”表示为UTF-8时只需要一个字节


其他长度表示表示表示该字符的字符串的长度。由于该字符的顺序可以存储在16位值中,因此只需要4个十六进制,加上转义的两个位置
\u
的长度为6。如果将其转换为字符串,则计算引号的两个额外位置。

Iink您应该阅读SO的联合创始人的这篇文章:“第二个长度(Len2)可能是单个unicode字符占用的总字节数”,这是错误的,当表示为UTF-8时,这实际上是unicode序列的长度(以字节为单位)。UTF-8只是存储unicode序列的多种方法之一(但现在经常使用)@Anthon tbh你刚刚改写了OP的评估并添加了“作为UTF-8”。@timgeb诚实地说什么?OP在我之前使用了
UTF-8
,看看代码。