>>> 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 encoding
?而'\u4e2d\u6587'
是一个unicode字符串或字节字符串?但是cu
必须存储在内存中,所以
0100 1110 0010 1101 0110 0101 1000 0111
(将\ u4e2d \ u6587转换为二进制)是cu
保存的形式,如果是字节字符串? 我是对的吗?
但它不能是字节串。否则len(cu)不能是2,应该是4 !! 所以它必须是unicode字符串。 但是!!! 我还learned
python试图用任何方式隐式编码Unicode字符串 scheme目前在sys.stdout.encoding中设置,在这个例子中它是 " UTF-8"
>>> cu.encode('utf-8')
'\xe4\xb8\xad\xe6\x96\x87'
原来如此!怎么可能len(cu)
== 2 ???那是因为里面有两个'\u'
吗?
但这并不能使len(su) == 2
有意义!
我错过了什么吗?
我正在使用python 2.7.12
答案 0 :(得分:0)
Python unicode
类型包含 Unicode代码点,并不意味着是一种编码。 Python内部如何实现这一点是一个实现细节,而不是大多数时候需要关注的事情。它们不是UTF-16代码单元,因为UTF-16是另一种可用于编码Unicode文本的编解码器,就像UTF-8一样。
最重要的是标准的Python str
对象包含 bytes ,它可能会也可能不会将文本编码为某个编解码器(您的示例使用的是UTF-8但是不是给定的),unicode
拥有 Unicode代码点。在交互式解释器会话中,终端的编解码器确定Python接收的字节数(然后在创建sys.stdin.encoding
u'...'
对象时根据需要使用unicode
解码这些字节)。
仅当写入sys.stdout
时(例如,使用print
时)才会发挥sys.stdout.encoding
值,Python将自动对您的Unicode字符串进行编码再次。只有然后将您的2个Unicode码点再次编码为UTF-8并写入您的终端,终端知道如何解释这些。
您可能想要了解Python和Unicode,我建议: