首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >len(unicode字符串)

问len(unicode字符串)
EN

Stack Overflow用户
提问于 2016-10-03 16:01:33
回答 1查看 1.9K关注 0票数 3
代码语言:javascript
复制
>>> 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必须存储在内存中,所以

代码语言:javascript
复制
0100 1110 0010 1101 0110 0101 1000 0111

(将\u4e2d\u 6587转换为二进制)是cu保存的形式,如果是字节字符串?是对的吗?

但不能是字节字符串。否则连(Cu)不能是2,应该是4!所以它必须是unicode字符串。但是!我也博学那个

python试图用sys.stdout.encoding中当前设置的任何方案隐式地对Unicode字符串进行编码,在本例中是"UTF-8“。

代码语言:javascript
复制
>>> cu.encode('utf-8')
'\xe4\xb8\xad\xe6\x96\x87' 

所以!len(cu) == 2怎么可能?是因为里面有两个'\u'吗?

但这不符合len(su) == 2的意思!

我是不是遗漏了什么?

我使用python 2.7.12

EN

回答 1

Stack Overflow用户

发布于 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的内容,我建议:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39835779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档