>>> 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默认的UTF-16编码的。对吧?所以,当我们看到'\u*' UTF-16 encoding**?,,,,那实际上是,'\u4e2d\u6587' 是unicode字符串或字节字符串?,但是cu必须存储在内存中,所以
0100 1110 0010 1101 0110 0101 1000 0111(将\u4e2d\u 6587转换为二进制)是cu保存的形式,如果是字节字符串?是对的吗?
但不能是字节字符串。否则连(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
发布于 2016-10-03 16:06:01
Python类型包含Unicode代码点,而不是编码。Python如何在内部做到这一点是一个实现细节,而不是大多数时候您需要关注的问题。它们不是UTF-16代码单元,因为UTF-16是另一种可以用来编码Unicode文本的编解码器,就像UTF-8一样。
这里最重要的事情是,标准的Python对象保存字节,字节可能保存也可能不保存对某个编解码器编码的文本(您的示例使用UTF-8,但这不是给定的),而unicode保存Unicode代码点。在交互式解释器会话中,由终端的编解码器确定Python接收到哪些字节(然后在创建u'...' unicode对象时使用unicode解码这些字节)。
只有在向sys.stdout写入(例如,在使用print时)时,sys.stdout.encoding值才会出现,在这里,sys.stdout.encoding将再次自动编码您的Unicode字符串。只有这样,您的2个Unicode编码点才会再次被编码到UTF-8,并写入您的终端,后者知道如何解释这些代码。
您可能想阅读有关Python和Unicode的内容,我建议:
https://stackoverflow.com/questions/39835779
复制相似问题