Python编码问题

Python3中,所有的字符串在内存中均是unicode保存。

t = 'abc'

上述语句在计算机内存的执行顺序是这样的:

  • 在内存中创建一个字符串'abc'
  • 在程序栈寄存器创建一个变量t
  • 使得寄存器中的变量t指向'abc'(也就是把字符串'abc'的地址赋给t

字符串变量在计算机内部的执行顺序

虽然内存总是unicode保存,但是输出到文件中就是utf-8或者GBK等格式,根据文件的编码类型不同而不同。

字符与unicode码的相互转化

  1. 字符转十进制unicode码
>>> ord("中")
20013
  1. 十进制unicode码转字符
>>> chr(20013)
'中'

str类型字符串和bytes类型字符串的相互转换

注意内容:

  • str类型的字符串在内存中是以unicode形式存在的
  • bytes类型的字符串可以是任意编码,表示形式是在字符串前面加b。例如b'ABC'即为bytes类型的字符串

转换方法:

str 转换为 bytes

>>> '中国'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'

>>> '中文'.encode('GBK')
b'\xd6\xd0\xce\xc4'

>>> '中文'.encode('ascii')

UnicodeEncodeError                        Traceback (most recent call last)
<ipython-input-12-b318511b2a75> in <module>()
1 '中文'.encode('ascii')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

第三条语句会报错,因为ascii编码无法解析中文

bytes 转换为 str

>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'

>>> b'\xd6\xd0\xce\xc4'.decode('GBK')
'中文'
demo_str = '宏杰'  # python3 默认的编码为unicode

# unicode 转换为 gb2312
unicode_gb2312 = demo_str.encode(’gb2312‘)  # 因为demo_str默认是unicode,所以不需要decode()成str。直接encode成要转换的编码gb2312。
print('gb2312:', unicode_gb2312)
b'\xba\xea\xbd\xdc'

# gb2312 转换为 utf-8
gb2312_utf8 = unicode_gb2312.decode('gb2312').encode('utf-8')  # 当前字符为gb2312所以要先decode成unicode(decode中传入的参数为当前字符的编码集)然后再encode成utf-8
print('utf-8: ', gb2312_utf8)

# utf8 转换为 gbk
utf8_gbk = gbk2312_utf8.decode('utf-8').encode('gbk')  # 当前字符集编码为utf-8,要想转换成gbk,要先decode成unicode字符集,再encode成gbk字符集。
print('gbk: ', utf8_gbk)

# utf8 转换为 unicode
utf8_unicode = utf8_gbk.decode('gbk')  # 注意当转换为unicode时,并不需要encode()了。
print('unicode: ' utf8_unicode)

# unicode 转换为 gb18030
unicode_gb18030 = utf8_unicode.encode('gb18030')
print('gb18030: ', unicode_gb18030)

总结各个编码的相互转化都要先转换为unicode然后通过unicode再转换为想要的编码
例如: utf-8、gb2312、gbk、gb18030 都是bytes字符集。中间桥梁为 unicode。

字符串str 转换为 bytes 使用encode()转换为字节码
bytes 转换为 字符串str 使用decode()转换为unicode编码

posted @ 2018-05-02 01:56  hehongjie  Views(234)  Comments(0Edit  收藏  举报