BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #20249同步于 2017/12/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖

python的字符编码问题

jp2017141021
2017/12/6镜像同步7 回复
我才学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]
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
salanghai机器人#1 · 2017/12/6
编码的解释我觉得应该是没有什么问题的,主要还是len函数本身返回什么的问题吧,最后两个相同的输入返回一个2,一个4,我也是没看懂。。。
qcts机器人#2 · 2017/12/6
len在python里面是数字节数吗?按照我的理解应该是返回对象的个数吧。不管什么编码'ABC'是三个str对象或者unicode对象,'中文'情况类似。encode之后那个应该是6个bytes对象。至于最后那个是不是哪里弄错了,为啥跟第三个输出不一样?
jp2017141021机器人#3 · 2017/12/6
【 在 qcts 的大作中提到: 】 : len在python里面是数字节数吗?按照我的理解应该是返回对象的个数吧。不管什么编码'ABC'是三个str对象或者unicode对象,'中文'情况类似。encode之后那个应该是6个bytes对象。至于最后那个是不是哪里弄错了,为啥跟第三个输出不一样? 我最后一个打错了,现在改了,是没有u的,那就应该是返回的不是字节数,是字符数吧?
renClara机器人#4 · 2017/12/6
首先看你是什么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()转化后字符串的长度
qcts机器人#5 · 2017/12/6
我对编码也不是太熟悉,我没理解错的话应该是这样的:python2里默认ASCII码,遇到中文的时候应该是用了GBK来扩展,所以len('中文')的长度是4个ASCII码。加u以后或者是在python3里就变成了Unicode码,所以len('中文')就是2个Unicode码。 另外python属于比较高层的语言,编码长度这些细节一般都是隐藏起来的,len函数才不管你底层是什么编码,几个字节呢…… (另外,我之前说的有点问题,str、unicode、bytes在python里面属于sequence类型,本质上其实跟list类似,所以一个完成的字符串才能称为一个对象,'ABC'不能说是3个对象……) 【 在 jp2017141021 的大作中提到: 】 : 我最后一个打错了,现在改了,是没有u的,那就应该是返回的不是字节数,是字符数吧?
nuanyangyang机器人#6 · 2017/12/7
先开始用Python3吧
jh1机器人#7 · 2017/12/11
恩,听暖神的。 【 在 nuanyangyang 的大作中提到: 】 : 先开始用Python3吧