日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

彻底搞懂 python 中文乱码问题_彻底搞懂 Python 编码 - sylan215的软件测试技术学习 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

發布時間:2023/12/15 python 29 豆豆

因為中文的特殊編碼,導致 Python2 和 Python3 使用過程中的各種編碼問題,如果不清楚其中的關聯關系,那么這就一直是個大坑,不是懵逼就還是懵逼,所以就目前碰到的情況徹底梳理下 Python2 和 Python3 中編碼的關系和區別,以作備忘。

先說下涉及編碼格式的幾個地方:腳本字符編碼:就是經常在腳本文件開頭看到的# -*- coding: utf-8 -*-,如果使用 Python2,沒有顯式聲明的話默認使用 ASCII 格式,Python3 默認使用 utf-8 格式;

解釋器字符編碼:可以通過函數sys.getdefaultencoding()查看,Python2 默認是 ASCII,Python3 默認使用 utf-8;

腳本文件存儲編碼:就是 py 腳本文件本身在物理介質上面的存儲格式,通常有 ASCII、GBK、utf-8 等格式。

下面我們把上述編碼分別在腳本中進行組合使用后,再使用 Python2.6 和 Python3.4 運行,看看實際都什么效果。

1.默認腳本文件編碼 + 文件存儲使用 gbk

腳本內容:importsys

print(sys.getdefaultencoding())

print('中文')

使用 Python2.6 運行的結果如下,提示gbk 編碼字符\xd6非 ASCII 字符:> python26 test_gbk.py

File"test_gbk.py", line4SyntaxError: Non-ASCII character'\xd6'infile test_gbk.py on line4, but no encoding declared; see http://www.python.org/peps/pep-0263.htmlfordetails

使用 Python3.4 運行的結果如下,提示gbk 編碼字符\xd6非 utf-8 字符:> python26 test_gbk.py

File"test_gbk.py", line4SyntaxError: Non-UTF-8code startingwith'\xd6'infile test_gbk.py on line4, but no encoding declared; see http://python.org/dev/peps/pep-0263/fordetails

結論:默認的 gbk 編碼中文,Python2的解釋器字符編碼(ASCII)和 Python3的解釋器字符編碼(utf-8)格式都沒法識別,因為 ASCII 編碼不包含中文,而 utf-8 是 3 字節編碼,gbk 是 2 字節編碼,所以都識別不了了。

2.腳本文件編碼 gbk + 文件存儲使用 gbk

在剛才的腳本頭部顯式聲明腳本文件編碼格式為 gbk:#coding:gbkimportsys

print(sys.getdefaultencoding())

print('中文')

使用 Python2.6 運行的結果:> python26 test_gbk.py

ascii

中文

使用 Python3.4 運行的結果:> python34 test_gbk.py

utf-8中文

結論:文件使用的 gbk 格式存儲,同時顯式聲明了腳本文件編碼為 gbk,Python2 和 Python3 都可以正常處理。

3.腳本文件編碼 utf-8 + 文件存儲使用 gbk

在剛才的腳本頭部顯式聲明腳本文件編碼格式為 utf-8:# -*- coding: utf-8 -*-importsys

print(sys.getdefaultencoding())

print('中文')

使用 Python2.6 運行的結果正常:> python26 test_gbk.py

ascii

中文

使用 Python3.4 運行的結果如下,提示嘗試使用 utf-8 解碼字符0xd6時異常:> python34 test_gbk.py

File"test_gbk.py", line6SyntaxError: (unicode error)'utf-8'codec can't decode byte 0xd6 in position 0: invalid continuation byte

結論:文件使用的 gbk 格式存儲,同時顯式聲明了腳本文件編碼為 utf-8時,但是 Python2 在 Windows 平臺還是使用 gbk 進行輸出,所以解析正常,而 Python3 使用 utf-8 所以解析異常。

4.默認腳本文件編碼 + 文件存儲使用 utf-8

去掉之前腳本頭部的聲明,然后使用 utf-8 格式存儲文件(注意,不能在剛才的文件基礎上強制修改存儲編碼,強制轉換會出現中文亂碼的問題,建議先新建一個 utf-8 格式的文件,然后再輸入中文):importsys

print(sys.getdefaultencoding())

print('中文')

使用 Python2.6 運行的結果如下,ASCII 也識別不了 utf-8 格式的字符\xe4:> python26 test.py

File"test.py", line4SyntaxError: Non-ASCII character'\xe4'infile test.py on line4, but no encoding declared; see http://www.python.org/peps/pep-0263.htmlfordetails

使用 Python3.4 運行的結果,可以正常識別,因為 Python3 默認使用 utf-8 編碼:> python34 test.py

utf-8中文

結論:默認的 utf-8 編碼中文,Python2 會默認使用 ASCII 讀取,所以沒法識別,Python3 可以正常識別。

5.腳本文件編碼 gbk + 文件存儲使用 utf-8

腳本頭部顯式聲明腳本文件編碼格式為 gbk,同時使用 utf-8 格式存儲文件:#coding:gbkimportsys

print(sys.getdefaultencoding())

print('中文')

使用 Python2.6 運行的結果如下,使用 gbk 根本讀取不了 utf-8 格式任何內容:> python26 test.py

File"test.py", line6SyntaxError:'gbk'codec can't decode bytes in position 9-10: illegal multibyte sequence

使用 Python3.4 運行的結果如下,其實和上面錯誤一樣,但是提示更直接了:> python34 test.py

File"test.py", line1SyntaxError: encoding problem: gbk

結論:默認的 utf-8 編碼中文,如果顯式指定使用 gbk 讀取,Python2 和 Python3 都沒法做到。

6.腳本文件編碼 utf-8 + 文件存儲使用 utf-8

腳本頭部顯式聲明腳本文件編碼格式為 utf-8,同時使用 utf-8 格式存儲文件:# -*- coding: utf-8 -*-importsys

print(sys.getdefaultencoding())

print('中文')

使用 Python2.6 運行的結果如下,雖然讀取正確了,但是 Python2 在 Windows 系統會默認使用 gbk 對中文進行解碼,所以輸出亂碼:> python26 test.py

ascii

涓枃

使用 Python3.4 運行的結果正常:> python34 test.py

utf-8中文

結論:雖然文件存儲編碼和腳本文件編碼都是 utf-8,但是 Windows 平臺上,Python2 會按 gbk 解析中文,所以會輸出亂碼,可以在中文前面加 u 來解決u'中文',或者顯式使用 utf-8 進行一次 decode。

匯總下驗證結果,可以得到如下的表格:不同組合下 Python3 和 Python2 處理結果Python3Python2默認腳本文件編碼 + 文件存儲使用 gbkSyntaxError,解析錯誤SyntaxError,解析錯誤

腳本文件編碼 gbk + 文件存儲使用 gbk正常輸出中文正常輸出中文

腳本文件編碼 utf-8 + 文件存儲使用 gbkSyntaxError,解析錯誤正常輸出中文

默認腳本文件編碼 + 文件存儲 utf-8正常輸出中文SyntaxError,解析錯誤

腳本文件編碼 gbk + 文件存儲使用 utf-8SyntaxError,解析錯誤SyntaxError,編碼錯誤

腳本文件編碼 utf-8 + 文件存儲使用 utf-8正常輸出中文中文輸出亂碼

總結下結論:如果使用 Python2 請一定要使用 gbk 格式存儲文件;

如果使用 Python2 盡可能使用 gbk 存儲文件且顯式聲明腳本文件編碼為 gbk,方便后續兼容 Python3;

如果使用 Python3 不管使用什么格式存儲文件,但請一定保證顯式聲明腳本文件編碼和存儲格式一致;

不管是使用 Python2 還是 Python3,保持顯式聲明腳本文件編碼的好習慣;

如果腳本有跨平臺需求,推薦使用 Python3 + 腳本文件編碼 utf-8 + utf-8 格式存儲文件的組合;

?

總結

以上是生活随笔為你收集整理的彻底搞懂 python 中文乱码问题_彻底搞懂 Python 编码 - sylan215的软件测试技术学习 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。