python2和python3中字符编码区别

标签: python2 python3 字符编码 unicode
21人阅读 评论(0) 收藏 举报

在python2和python3中,字符在内存中以unicode形式存在。在进行编码方式转换时,unicode形式应作为中介,在decode和encode中转换。如下图:

编码

python2中的字符编码

在ipython中,默认编码为utf-8。

In [1]: astr='你好,python'

In [2]: astr
Out[2]: '\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8cpython'

In [3]: astr.encode('utf8')
----------------------------------------------------
UnicodeDecodeError                        Traceback
<ipython-input-3-cb3c3e44ee4d> in <module>()
----> 1 astr.encode('utf8')

UnicodeDecodeError: 'ascii' codec can't decode byte

In [4]: astr.decode('utf8').encode('utf8')
Out[4]: '\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8cpython'

In [5]: bstr=u'你好,python'

In [6]: bstr
Out[6]: u'\u4f60\u597d\uff0cpython'

In [7]: bstr.encode('utf8')
Out[7]: '\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8cpython'

在python shell中,默认编码为命令行终端的默认编码,作者的是windows7 cmd环境,默认编码为gb2312。

>>> astr='你好,python'

>>> astr
'\xc4\xe3\xba\xc3\xa3\xacpython'

>>> astr.encode('utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)

>>> astr.decode('utf8').encode('utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "E:\Anaconda\envs\py27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc4 in position 0: invalid continuation byte

>>> astr.decode('gb2312').encode('utf8')
'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8cpython'

>>> bstr=u'你好,python'

>>> bstr
u'\u4f60\u597d\uff0cpython'

>>> bstr.encode('utf8')
'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8cpython'

在python2中,字符以各个终端环境中的默认编码或者指定的编码形式存储,进行编码转换时,需要先将字符解码转为unicode形式,在编码为指定形式的编码字符。

python3中的字符编码

在ipython中:

In [1]: astr='你好,python'

In [2]: astr
Out[2]: '你好,python'

In [3]: astr.encode('utf8')
Out[3]: b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8cpython'

In [4]: astr.decode('utf8').encode('utf8')
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-2a9e1e602dd8> in <module>()
----> 1 astr.decode('utf8').encode('utf8')

在python3 shell中:

>>> astr='你好,python'

>>> astr
'你好,python'

>>> astr.encode('utf8')
b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8cpython'

>>> astr.decode('gb2312').encode('utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'decode'

在python3中,字符默认是以unicode形式存储的。

查看评论

Python2和3的字符串编码差别

本文用实验详细地演示了Python2和Python3在字符串编码上的区别。在Python2中,字符串字面量对应于8位的字符或面向字节编码的字节字面量。这些字符串的一个重要限制是它们无法完全地支持国际字...
  • WuLex
  • WuLex
  • 2017-05-27 20:53:36
  • 760

Python2Vs3

  • 2012年06月29日 23:15
  • 74KB
  • 下载

Python2和Python3之间关于字符串编码处理的差别

0x00 字符的编码计算机毕竟是西方国家的发明,最开始并没有想到会普及到全世界,只用一个字节中的7位(ASCII)来表示字符对于现在庞大的文字数量来说显然不够,所以先后经历了好几套编码方案,不同国家和...
  • yanghuan313
  • yanghuan313
  • 2017-03-18 23:06:32
  • 4588

python2和python3编码区别

在python2中主要有str和unicode两种字符串类型,而到python3中改为了bytes和str,并且一个很重要的分别是,在python2中如果字符串是ascii码的话,str和unicod...
  • u011546806
  • u011546806
  • 2015-04-08 09:24:47
  • 2004

Python2和Python3的区别

python3和Python2的区别 print函数:(Python3中print为一个函数,必须用括号括起来;Pytho...
  • pku_Coder
  • pku_Coder
  • 2017-01-11 22:57:53
  • 797

python2 与python3中最大的区别(编码问题

python2 与python3中最大的区别 1,在python2.x 中是不区分bytes和str类型的,在python3中bytes和str中是区分开的,str的所有操作bytes都支持 pyth...
  • u010694764
  • u010694764
  • 2016-12-22 10:30:30
  • 1634

Python 3读写文件和Python2的区别

最近再看python处理csv的内容,查阅之前有python2 打开csv文件的操作: writer = csv.writer (open('test.csv','wb') 但是在pyth...
  • yujianmse
  • yujianmse
  • 2015-11-10 14:24:58
  • 1178

python2和python3主要区别

这篇文章主要介绍了Python 2.7.x 和 3.x 版本的重要区别小结,需要的朋友可以参考下 许多Python初学者都会问:我应该学习哪个版本的Python。对于这个问题,我的回答通常是“先...
  • u010694764
  • u010694764
  • 2017-02-15 10:23:36
  • 4111

Python2与Python3的区别(九):Queue与queue

Note The Queue module has been renamed to queue in Python 3. The 2to3 tool will automatically adapt...
  • foryouslgme
  • foryouslgme
  • 2016-08-29 16:46:13
  • 850

日常小结-python2.x和python3.x之间关于String的区别

本文内容主要来自于GTK+3 教程4How to Deal With Strings 我觉得内容写的挺好的,这里总结一下。Unicode 及UTF-8首先字符串可以看成是一串字符的表示,每个字符都可以...
  • u011518120
  • u011518120
  • 2016-07-28 22:24:07
  • 1755
    个人资料
    持之以恒
    等级:
    访问量: 3万+
    积分: 719
    排名: 7万+
    阿里云·云产品·幸运券(点击图片,快速领取)