Python3
中,所有的字符串在内存中均是unicode
保存。
t = 'abc'
上述语句在计算机内存的执行顺序是这样的:
- 在内存中创建一个字符串
'abc'
- 在程序栈寄存器创建一个变量
t
- 使得寄存器中的变量
t
指向'abc'
(也就是把字符串'abc'
的地址赋给t
)
虽然内存总是unicode
保存,但是输出到文件中就是utf-8
或者GBK
等格式,根据文件的编码类型不同而不同。
字符与unicode码的相互转化
- 字符转十进制unicode码
>>> ord("中")
20013
- 十进制unicode码转字符
>>> chr(20013)
'中'
str类型字符串和bytes类型字符串的相互转换
注意内容:
str类型
的字符串在内存中是以unicode
形式存在的bytes类型
的字符串可以是任意编码,表示形式是在字符串前面加b
。例如b'ABC'
即为bytes类型的字符串
转换方法:
str
转换为 bytes
>>> '中国'.encode('utf-8')
b'xe4xb8xadxe6x96x87'
>>> '中文'.encode('GBK')
b'xd6xd0xcexc4'
>>> '中文'.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'xe4xb8xadxe6x96x87'.decode('utf-8')
'中文'
>>> b'xd6xd0xcexc4'.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'xbaxeaxbdxdc'
# 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编码