返回信息流我才学python有些问题没看懂
问题可能有点白痴了
就是看了一个教程,上面有这样一段
捋一捋ASCII编码和Unicode编码的区别:ASCII编码是1个字节,而Unicode编码通常是2个字节。
由ASCIII到Unicode:
字母A用ASCII编码是十进制的65,二进制的01000001
如果把ASCII编码的A用Unicode编码,只需要在前面补0就可以,因此,A的Unicode编码是00000000 01000001
但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。
本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。
UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间
UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分
于是我输入了以下代码
>>> u'ABC'.encode('utf-8')
'ABC'
>>> u'中文'.encode('utf-8')
'\xe4\xb8\xad\xe6\x96\x87'
>>> len(u'ABC')
3
>>> len('ABC')
3
>>> len(u'中文')
2
>>> len('\xe4\xb8\xad\xe6\x96\x87')
6
>>> len('中文')
4
那为什么unicode编的ANC是3个字节呢,不应该是6个嘛,刚才说unicode是两个字节表示一个字母,但第一个输出却是3
unicode编出来的“中文”不应该是四个字节吗,刚才说的一个中文两个字节,但第三个输出却是2.
还有最后一个输出是4也不是很理解。
有没有对这个清楚的,我看完了觉得好晕[ema1]
这是一条镜像帖。来源:北邮人论坛 / python / #20249同步于 2017/12/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
python的字符编码问题
jp2017141021
2017/12/6镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
len在python里面是数字节数吗?按照我的理解应该是返回对象的个数吧。不管什么编码'ABC'是三个str对象或者unicode对象,'中文'情况类似。encode之后那个应该是6个bytes对象。至于最后那个是不是哪里弄错了,为啥跟第三个输出不一样?
【 在 qcts 的大作中提到: 】
: len在python里面是数字节数吗?按照我的理解应该是返回对象的个数吧。不管什么编码'ABC'是三个str对象或者unicode对象,'中文'情况类似。encode之后那个应该是6个bytes对象。至于最后那个是不是哪里弄错了,为啥跟第三个输出不一样?
我最后一个打错了,现在改了,是没有u的,那就应该是返回的不是字节数,是字符数吧?
首先看你是什么version的python,不同version的结果好像不一样。我在python 2.7.12运行
>>> print repr(u'中文')
u'\u4e2d\u6587'
>>> len(u'中文')
2
>>> print repr('中文')
'\xe4\xb8\xad\xe6\x96\x87'
>>> len('中文')
6
>>> print repr('ABC')
'ABC'
>>> print repr(u'ABC')
u'ABC'
>>> len('ABC')
3
>>> len(u'ABC')
3
repr() 函数将对象转化为供解释器读取的形式。len() 函数返回的好像是repr()转化后字符串的长度
我对编码也不是太熟悉,我没理解错的话应该是这样的:python2里默认ASCII码,遇到中文的时候应该是用了GBK来扩展,所以len('中文')的长度是4个ASCII码。加u以后或者是在python3里就变成了Unicode码,所以len('中文')就是2个Unicode码。
另外python属于比较高层的语言,编码长度这些细节一般都是隐藏起来的,len函数才不管你底层是什么编码,几个字节呢……
(另外,我之前说的有点问题,str、unicode、bytes在python里面属于sequence类型,本质上其实跟list类似,所以一个完成的字符串才能称为一个对象,'ABC'不能说是3个对象……)
【 在 jp2017141021 的大作中提到: 】
: 我最后一个打错了,现在改了,是没有u的,那就应该是返回的不是字节数,是字符数吧?