1. 程式人生 > >python2 中文 亂碼問題

python2 中文 亂碼問題

亂碼產生的原因

亂碼產生的根本原因是位元組流轉換字元前後不一致導致。只要掌握了這個核心,就能解決亂碼問題,在java中,由於嚴格區分了位元組流和字元,所以理解起來比較簡單。但python2中使用了一些“trick”(沒有區分字元和位元組流),所以理解起來有些困難。在python中遇到沒有指定為unicode的string,就理解為位元組流! 位元組流,沒有編碼,只有位元組,所以在轉換字元時經常會出現亂碼。接下來說明亂碼的幾個點及解決辦法。

原始檔編碼、字串編碼

在python中有2個地方的編碼要注意,原始檔的編碼、字串的編碼,只要設定正確了就不會出現亂碼。

原始檔編碼

在原始檔的第一行或者第二行一定要宣告檔案的編碼方式

並且與檔案編碼一致,通常會將原始檔儲存為utf8,宣告也是utf8,如

# coding=utf8

#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編碼。如

'你好' #這裡沒有指定編碼,所以就是utf8的位元組流,輸出到控制檯時,轉為gbk,因為由utf8位元組流--轉--->gbk,不相容,所以,就出現亂碼了。
u'你好' #指定字串為unicode編碼
'你好'.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,不會出現這些問題了。

參考

相關推薦

python2 中文 亂碼問題

亂碼產生的原因 亂碼產生的根本原因是位元組流轉換字元前後不一致導致。只要掌握了這個核心,就能解決亂碼問題,在java中,由於嚴格區分了位元組流和字元,所以理解起來比較簡單。但python2中使用了一些“trick”(沒有區分字元和位元組流),所以理解起來有些困

Python2中文亂碼處理

背景本文在Window7 & python2.7.13下執行測試。Python2處理中文字元時經常遇到亂碼問題,根源在於python儲存漢字的兩種表示形式和Window系統編碼之間的矛盾。本文通

python筆記5-python2寫csv文件中文亂碼問題

tde unicode編碼 [] utf set 分享圖片 lis ber utf-8 前言 python2最大的坑在於中文編碼問題,遇到中文報錯首先加u,再各種encode、decode。當list、tuple、dict裏面有中文時,打印出來的是Unicode編碼,這個是

處理Python2.7讀寫文件中的中文亂碼問題

創建 文本文件 odi 出現 print 文本 處理 ecs 報錯 1.設置默認編碼 在Python代碼中的任何地方出現中文,編譯時都會報錯,這時可以在代碼的首行添加相應說明,明確utf-8編碼格式,可以解決一般情況下的中文報錯。當然,編程中遇到具體問題還需具體分析啦。 #

Python2 中文unicode亂碼問題

在 Sublime Text 裡用 Cmd (Ctrl) + B 執行程式碼 print u'中文',想要打印出 unicode 型別的字串時,會出現以下報錯: UnicodeEncodeError: 'ascii' codec can't encode characters in position 0

python2 使用定時任務中文亂碼

問題:pyhon2手動執行程式時,資料正常錄入資料庫,使用定時任務時資料亂碼 原因:由於python2 使用定時任務不會載入使用者的環境變數,需要在執行任務前,載入使用者環境變數 .       

python2終端列印中文亂碼

之前自學了python3,然後想寫一個小程式發現公司系統無法執行python3,也有幾百臺所以我就放棄他去用python2, 然後向終端列印的時候老是亂碼查了很多部落格都是說在前面加上#coding:utf-8 。結果還是有亂碼,今天來個簡單的 ,具體原理我是不清楚如果有

處理Python2.7讀寫檔案中的中文亂碼問題

Python2.7對於中文編碼的問題處理的並不好,這幾天在爬資料的時候經常會遇到中文的編碼問題。但是本人對編碼原理不瞭解,也沒時間深究其中的原理。在此僅從應用的角度做一下總結, 1.設定預設編碼 在Python程式碼中的任何地方出現中文,編譯時都會報錯,這時

python2. requests爬取網上資料中文亂碼的情況處理方法

先說下發現的問題,今天在做一個爬取功能的時候,中文一直是亂碼,原來以為是返回的資料壓縮導致的,後邊查了下文件,requests裡如果headers設定了'Accept-Encoding': 'gzip, deflate',且目標網頁也支援壓縮的話,requests會把爬到的網

JAVA開發中文亂碼的幾個解決方案

ont character delete bsp mage gbk net utf-8 type 一:html亂碼或者引入的JS亂碼 1:第一步,text file encoding 首先確保文件的保存格式要UTF-8,如在eclipse中,要在文件上點屬性,確保這裏選擇U

ubuntu MySQL數據庫輸入中文亂碼 解決方案

title str itl alt 查詢 ref cte class nbsp 一、登錄MySQL查看用SHOW VARIABLES LIKE ‘character%’;下字符集,顯示如下:+--------------------------+--------------

Java中的中文亂碼問題

jsp req 安裝路徑 漢字 mysql配置文件 rac name line 進行 客戶端向服務器發送請求時,有兩種方式post和get請求,當客戶端提交的內容有中文時。服務器要進行設置才能獲得中文,否則獲得的是亂碼。那麽怎麽設置呢:在servlet中進行設置,有兩種情

C#對URL中的中文亂碼處理

res quest 類庫 處理 odin .dll 前言 中文亂碼 ring 前言:UTF-8中,一個漢字對應三個字節,GB2312中一個漢字占用兩個字節。 不論何種編碼,字母數字都不編碼,特殊符號編碼後占用一個字節。 1、直接在C#後臺編碼URL參數 引用類庫:Syste

中文亂碼問題

ext cte blog ons char Coding latin encoding logs      一般用下面的這幾句就可以     request.setCharacterEncoding("utf-8"); response.setCharac

bat腳本啟動exe並打開文件後退出 + 中文亂碼

找不到 echo code step 模板 blocks sta 輸入 off 寫了個腳本用於復制模板到新的cpp文件。 將腳本路徑加到環境變量裏,只需在cmd窗口輸入“new hdu 1419”,就會自動將模板拷貝到WORK_DIR下的hdu文件夾內一個名叫"1419.c

mac用ssh連接linux雲服務器中文亂碼或無法顯示解決

logs ubuntu ubunt span text 字符 html charset osx 問題1:服務器是ubuntu16.04,用mac自帶的ssh連接後無法正常輸入中文? 解:這種情況一般是終端和服務器的字符集不匹配,MacOSX下默認的是utf8字符集。 打開編

json傳輸數據解決中文亂碼問題

.ajax https servle set encode url todo except uri 1.Ajax在url帶參數(中文):    encodeURI(encodeURI(expireDesc))//設置編碼 2.後臺接收需要轉碼:   URLDecoder.d

關於.NET HttpCookie 中文亂碼問題

sys esp value 解碼 enc default logs tostring system HttpCookie Cookie = new HttpCookie("Shop"); //服務端存入Cook

解決springmvc返回json中文亂碼

jackson ons con handle json 額外 adapter blog 設置 [email protected]/* */,這個問題上網找了很久,發現答案真是人雲亦雲,奉上我的解決方案: 解決方案一:需要導入 jackson-core-asl-1

處理Servlet響應中文亂碼

ase tchar ans servle write toc value source padding 首先,response返回有兩種,一種是字節流outputstream,一種是字符流printwrite。 申明:這裏為了方便起見,所有輸出都統一用UTF-8編碼。 先說