python2和python3中字符编码区别

版权声明:本文为博主 [小明同学爱思考] 原创文章,转载请注明出处。 https://blog.csdn.net/sinat_22840937/article/details/79973199

在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形式存储的。

阅读更多

扫码向博主提问

小明同学爱思考

对文章中不懂之处,欢迎提问,一起交流~
  • 擅长领域:
  • java
  • python3
  • SpringBoot
  • 机器学习
  • 大数据开发
去开通我的Chat快问
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页