>>> c='中文'
>>> c
'\xe4\xb8\xad\xe6\x96\x87'
>>> len(c)
6
>>> cu=u'中文'
>>> cu
u'\u4e2d\u6587'
>>> len(cu)
2
>>> s=''
>>> s
'\xf0\xa4\xad\xa2'
>>> len(s)
4
>>> su=u''
>>> su
u'\U00024b62'
>>> len(su)
2
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.stdout.encoding
'UTF-8'
首先,我想要澄清一些概念。我了解到像cu=u'中文'
这样的Unicode字符串实际上是由Python shell默认编码为UTF-16的。对吗?所以,当我们看到'\u*'
时,那实际上是UTF-16编码
吗?而'\u4e2d\u6587'
是一个Unicode字符串还是字节字符串?但是cu
必须存储在内存中。
0100 1110 0010 1101 0110 0101 1000 0111
(将中文转换为二进制) 是 cu
保存的形式,如果是字节字符串吗?我说得对吗?
但它不能是字节字符串。否则 len(cu) 就不可能是2,应该是4!! 所以它必须是Unicode字符串。但是!!! 我也了解到
Python试图使用当前在sys.stdout.encoding中设置的任何编码方案隐式地对Unicode字符串进行编码,在此示例中为"UTF-8"。
>>> cu.encode('utf-8')
'\xe4\xb8\xad\xe6\x96\x87'
那么!为什么len(cu)
等于2?这是因为它里面有两个'\u'
吗?
但这样len(su) == 2
就没有意义了!
我有什么遗漏的地方吗?
我正在使用Python 2.7.12。