[python] 中文亂碼問題


亂碼產生的原因
亂碼產生的根本原因是字節流轉換字符前后不一致導致。只要掌握了這個核心,就能解決亂碼問題。python2中使用了一些“trick”(沒有區分字符和字節流),所以理解起來有些困難。在python中遇到沒有指定為unicode的string,就理解為字節流! 字節流,沒有編碼,只有字節,所以在轉換字符時經常會出現亂碼。

源文件編碼、字符串編碼
在python中有2個地方的編碼要注意,源文件的編碼、字符串的編碼,只要設置正確了就不會出現亂碼。

源文件編碼
在源文件的第一行或者第二行一定要聲明文件的編碼方式並且與文件編碼一致,通常會將源文件保存為utf8,聲明也是utf8,如

1 # coding=utf8

1 #coding:utf8

如果不指定源碼文件編碼格式,文件中包含非ascii字符就會出現錯誤。

SyntaxError: Non-ASCII character ‘\xe4’ in file test_encoding.py on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

這是因為,如果不指定源文件編碼,python解釋器會按照默認的字符集ascii來解碼文件,由於中文不屬於ascii字符集,所以會出錯。

 

 

 

 

 

 

字符串編碼

字符串編碼分兩種情況,
指定了unicode:在字符串前邊加u,如u'你好' ,這種情況不會出現亂碼;
沒指定unicode:普通字符串的寫法,如'你好' ,這種情況字符串的編碼與源文件編碼一致;當字符串編碼與控制台編碼不一致時,就會出現亂碼,這是因為python中的字符串就是字節數組,由於沒有聲明為unicode,所以按照windows terminal的默認編碼gbk來解碼(從字節數組轉為字符),utf8的字節數組轉為gbk的字符,肯定是不兼容的,所以出現了亂碼。如

 

 

 

 

 解決辦法很簡單,指定為unicode或者使用decode函數將字符串轉為unicode編碼。如

1 '你好' #這里沒有指定編碼,所以就是utf8的字節流,輸出到控制台時,轉為gbk,因為由utf8字節流--轉--->gbk,不兼容,所以,就出現亂碼了。
2 u'你好' #指定字符串為unicode編碼
3 '你好'.decode('utf8')#將utf8的字符串解碼為unicode

 

 

 

因為這里用到了decode函數,所以說一下decode、encode函數

decode(), 解碼就是將字節流轉為字符,python中特指,其他字符集(比如,utf8、gbk、isoo8859-1)解碼為unicode
encode(),編碼就是從字符轉為字節流,python中特指,unicode編碼為其他字符集(比如,utf8、gbk、isoo8859-1)

關於這個知識點可以這樣理解,unicode包含世界所有的字符,編碼、解碼都要圍繞unicode來進行,否則由於不兼容就會出錯;從unicode到utf8就是編碼,從utf8到unicode就是解碼;

出現字符串的地方,都指定為unicode編碼。

總結
綜上所述,最簡單的辦法就是聲明的編碼類型與源文件一致,出現字符串的地方都指定為unicode編碼,能解決99%的亂碼問題。python3默認就是unicode,不會出現這些問題了。
————————————————
版權聲明:本文為CSDN博主「干凈的句號」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wangjun5159/article/details/52771277


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM