len(unicode string)

时间:2016-10-03 16:01:34

标签: python python-2.7 unicode encoding utf-8

>>> 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

1 个答案:

答案 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,我建议: