python编码规范utf8还是gbk还是ask_彻底搞懂 Python 编码
因?yàn)橹形牡奶厥饩幋a,導(dǎo)致 Python2 和 Python3 使用過程中的各種編碼問題,如果不清楚其中的關(guān)聯(lián)關(guān)系,那么這就一直是個(gè)大坑,不是懵逼就還是懵逼,所以就目前碰到的情況徹底梳理下 Python2 和 Python3 中編碼的關(guān)系和區(qū)別,以作備忘。
先說下涉及編碼格式的幾個(gè)地方:腳本字符編碼:就是經(jīng)常在腳本文件開頭看到的# -*- coding: utf-8 -*-,如果使用 Python2,沒有顯式聲明的話默認(rèn)使用 ASCII 格式,Python3 默認(rèn)使用 utf-8 格式;
解釋器字符編碼:可以通過函數(shù)sys.getdefaultencoding()查看,Python2 默認(rèn)是 ASCII,Python3 默認(rèn)使用 utf-8;
腳本文件存儲(chǔ)編碼:就是 py 腳本文件本身在物理介質(zhì)上面的存儲(chǔ)格式,通常有 ASCII、GBK、utf-8 等格式。
下面我們把上述編碼分別在腳本中進(jìn)行組合使用后,再使用 Python2.6 和 Python3.4 運(yùn)行,看看實(shí)際都什么效果。
1.默認(rèn)腳本文件編碼 + 文件存儲(chǔ)使用 gbk
腳本內(nèi)容:
import sys
print(sys.getdefaultencoding())
print('中文')
使用 Python2.6 運(yùn)行的結(jié)果如下,提示gbk 編碼字符\xd6非 ASCII 字符:
> python26 test_gbk.py
File "test_gbk.py", line 4
SyntaxError: Non-ASCII character '\xd6' in file test_gbk.py on line 4, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
使用 Python3.4 運(yùn)行的結(jié)果如下,提示gbk 編碼字符\xd6非 utf-8 字符:
> python26 test_gbk.py
File "test_gbk.py", line 4
SyntaxError: Non-UTF-8 code starting with '\xd6' in file test_gbk.py on line 4, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
結(jié)論:默認(rèn)的 gbk 編碼中文,Python2的解釋器字符編碼(ASCII)和 Python3的解釋器字符編碼(utf-8)格式都沒法識(shí)別,因?yàn)?ASCII 編碼不包含中文,而 utf-8 是 3 字節(jié)編碼,gbk 是 2 字節(jié)編碼,所以都識(shí)別不了了。
2.腳本文件編碼 gbk + 文件存儲(chǔ)使用 gbk
在剛才的腳本頭部顯式聲明腳本文件編碼格式為 gbk:
#coding:gbk
import sys
print(sys.getdefaultencoding())
print('中文')
使用 Python2.6 運(yùn)行的結(jié)果:
> python26 test_gbk.py
ascii
中文
使用 Python3.4 運(yùn)行的結(jié)果:
> python34 test_gbk.py
utf-8
中文
結(jié)論:文件使用的 gbk 格式存儲(chǔ),同時(shí)顯式聲明了腳本文件編碼為 gbk,Python2 和 Python3 都可以正常處理。
3.腳本文件編碼 utf-8 + 文件存儲(chǔ)使用 gbk
在剛才的腳本頭部顯式聲明腳本文件編碼格式為 utf-8:
# -*- coding: utf-8 -*-
import sys
print(sys.getdefaultencoding())
print('中文')
使用 Python2.6 運(yùn)行的結(jié)果正常:
> python26 test_gbk.py
ascii
中文
使用 Python3.4 運(yùn)行的結(jié)果如下,提示嘗試使用 utf-8 解碼字符0xd6時(shí)異常:
> python34 test_gbk.py
File "test_gbk.py", line 6
SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0xd6 in position 0: invalid continuation byte
結(jié)論:文件使用的 gbk 格式存儲(chǔ),同時(shí)顯式聲明了腳本文件編碼為 utf-8時(shí),但是 Python2 在 Windows 平臺(tái)還是使用 gbk 進(jìn)行輸出,所以解析正常,而 Python3 使用 utf-8 所以解析異常。
4.默認(rèn)腳本文件編碼 + 文件存儲(chǔ)使用 utf-8
去掉之前腳本頭部的聲明,然后使用 utf-8 格式存儲(chǔ)文件(注意,不能在剛才的文件基礎(chǔ)上強(qiáng)制修改存儲(chǔ)編碼,強(qiáng)制轉(zhuǎn)換會(huì)出現(xiàn)中文亂碼的問題,建議先新建一個(gè) utf-8 格式的文件,然后再輸入中文):
import sys
print(sys.getdefaultencoding())
print('中文')
使用 Python2.6 運(yùn)行的結(jié)果如下,ASCII 也識(shí)別不了 utf-8 格式的字符\xe4:
> python26 test.py
File "test.py", line 4
SyntaxError: Non-ASCII character '\xe4' in file test.py on line 4, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
使用 Python3.4 運(yùn)行的結(jié)果,可以正常識(shí)別,因?yàn)?Python3 默認(rèn)使用 utf-8 編碼:
> python34 test.py
utf-8
中文
結(jié)論:默認(rèn)的 utf-8 編碼中文,Python2 會(huì)默認(rèn)使用 ASCII 讀取,所以沒法識(shí)別,Python3 可以正常識(shí)別。
5.腳本文件編碼 gbk + 文件存儲(chǔ)使用 utf-8
腳本頭部顯式聲明腳本文件編碼格式為 gbk,同時(shí)使用 utf-8 格式存儲(chǔ)文件:
#coding:gbk
import sys
print(sys.getdefaultencoding())
print('中文')
使用 Python2.6 運(yùn)行的結(jié)果如下,使用 gbk 根本讀取不了 utf-8 格式任何內(nèi)容:
> python26 test.py
File "test.py", line 6
SyntaxError: 'gbk' codec can't decode bytes in position 9-10: illegal multibyte sequence
使用 Python3.4 運(yùn)行的結(jié)果如下,其實(shí)和上面錯(cuò)誤一樣,但是提示更直接了:
> python34 test.py
File "test.py", line 1
SyntaxError: encoding problem: gbk
結(jié)論:默認(rèn)的 utf-8 編碼中文,如果顯式指定使用 gbk 讀取,Python2 和 Python3 都沒法做到。
6.腳本文件編碼 utf-8 + 文件存儲(chǔ)使用 utf-8
腳本頭部顯式聲明腳本文件編碼格式為 utf-8,同時(shí)使用 utf-8 格式存儲(chǔ)文件:
# -*- coding: utf-8 -*-
import sys
print(sys.getdefaultencoding())
print('中文')
使用 Python2.6 運(yùn)行的結(jié)果如下,雖然讀取正確了,但是 Python2 在 Windows 系統(tǒng)會(huì)默認(rèn)使用 gbk 對(duì)中文進(jìn)行解碼,所以輸出亂碼:
> python26 test.py
ascii
涓枃
使用 Python3.4 運(yùn)行的結(jié)果正常:
> python34 test.py
utf-8
中文
結(jié)論:雖然文件存儲(chǔ)編碼和腳本文件編碼都是 utf-8,但是 Windows 平臺(tái)上,Python2 會(huì)按 gbk 解析中文,所以會(huì)輸出亂碼,可以在中文前面加 u 來解決u'中文',或者顯式使用 utf-8 進(jìn)行一次 decode。
匯總下驗(yàn)證結(jié)果,可以得到如下的表格:
總結(jié)下結(jié)論:如果使用 Python2 請(qǐng)一定要使用 gbk 格式存儲(chǔ)文件;
如果使用 Python2 盡可能使用 gbk 存儲(chǔ)文件且顯式聲明腳本文件編碼為 gbk,方便后續(xù)兼容 Python3;
如果使用 Python3 不管使用什么格式存儲(chǔ)文件,但請(qǐng)一定保證顯式聲明腳本文件編碼和存儲(chǔ)格式一致;
不管是使用 Python2 還是 Python3,保持顯式聲明腳本文件編碼的好習(xí)慣;
如果腳本有跨平臺(tái)需求,推薦使用 Python3 + 腳本文件編碼 utf-8 + utf-8 格式存儲(chǔ)文件的組合;
總結(jié)
以上是生活随笔為你收集整理的python编码规范utf8还是gbk还是ask_彻底搞懂 Python 编码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何借助 Excel 快速批量创建 20
- 下一篇: 大展宏兔、逐梦星辰 —中国探月航天太空兔