python2 中文 亂碼問題
亂碼產生的原因
亂碼產生的根本原因是位元組流轉換字元前後不一致導致。只要掌握了這個核心,就能解決亂碼問題,在java中,由於嚴格區分了位元組流和字元,所以理解起來比較簡單。但python2中使用了一些“trick”(沒有區分字元和位元組流),所以理解起來有些困難。在python中遇到沒有指定為unicode的string,就理解為位元組流! 位元組流,沒有編碼,只有位元組,所以在轉換字元時經常會出現亂碼。接下來說明亂碼的幾個點及解決辦法。
原始檔編碼、字串編碼
在python中有2個地方的編碼要注意,原始檔的編碼、字串的編碼,只要設定正確了就不會出現亂碼。
原始檔編碼
在原始檔的第一行或者第二行一定要宣告檔案的編碼方式
# 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編碼。 先說