python中的中文編碼的問題彙總

2021-08-20 22:51:57 字數 2622 閱讀 1855

編碼,真的可以說是乙個大坑,為了避免這個大坑,確實需要從原理上來理解,然後解決問題的時候,一一對問題進行排查即可,實在不行,真的就是print型別出來,看到底是什麼問題。

首先,在python2環境下,預設的編碼格式是ascii編碼,在沒有修改編碼格式的時候,在.py檔案中,無法正常的列印漢字,並且在讀取中文的時候也會出錯。這個時候報錯資訊為

file "d:/work_offer/6.25.py", line 2

syntaxerror: non-ascii character '\xe4' in file d:/work_offer/6.25.py on line 2, but no encoding declared; see for details

解決策略: 在.py檔案中頭部加入這樣一行

# -*- coding:utf-8 -*-
在python3的環境下,預設的編碼格式是utf-8,可以正常的讀寫中文,這個時候不需要額外的指定編碼方式。

所以,我們現在需要明確的幾點問題,第乙個問題是字元的編碼方式有哪些?第二個問題是字元的編碼方式之間怎麼進行轉換?第三個問題是如果不能解決編碼問題,我們如何來進行排查問題呢?第四個問題,我們一些設定的根源解決方法是為什麼可以達到目的,我們從這幾個問題,邏輯不太順的情況下,慢慢的回答這些問題。

一,字元的編碼方式

想到編碼方式,我就想到了百家爭鳴,這是個好事,但多樣性,不統一性也帶來了很多的問題。很多的編碼方式,因為沒有統一的格式,所以還得各種轉換,給程式設計師帶來了很多的問題。我們慢慢的學習,逐個攻破這些問題。

【ascii】很常用的編碼方式,把英文本母,數字,標點符號,特殊的符號(2的7次,128個),但真的最大的問題嘛就是只考慮英文,沒有考慮中文的情況。。。

【gb2312,gbk】對於中文的編碼方式,解決了漢字編碼的方式。

【unicode】統一的編碼方式,想要一統天下,也稱為了萬國碼,用16位長的數字來進行表示,固定長度,解決了要表達數量巨大的字元編碼的問題,但也有很大的問題,就在於對空間的利用率不高,也就是很多的浪費。僅僅是字符集。。

【utf-8】在unicode的基礎上,實現不等長的編碼,也就是可以更好的利用空間,利用率更高,更適合傳輸過程。

【ansi】多位元組字元系統,也就是對於ascii編碼的擴充套件。。。對於中文來說,典型的ansi編碼為gb2312。

在window記事本對文字進行儲存是,預設的是ansi方式,當然可以選擇unicode,utf-8等方式,只是在開頭會有幾個多出來的位元組,來表明編碼的方式。在unicode前加的是fffe,在utf-8前面加的是ef,bb,bf。在用應用軟體開啟檔案的時候,需要先檢測頭部的標識,來明確編碼方式。

在這,我們應該還是有疑問的,也就是從之前的ascii編碼方式,然後發現不適用,然後出現各種的編碼方式,比如中文中的gb2312等,這些都叫做ansi,之後有想要一統天下的編碼方式,也就是unicode,但unicode只是字符集,不是實現方式,而utf-8是unicode的一種編碼實現方式。

更近一步說明,unicode是一種字元型別的物件,與str是乙個級別的。。然後表示的是型別,然後str可以是各種編碼實現,也就是str儲存的就是編碼之後的結果,而unicode,是表示unicode字符集的結果。二者進行轉換,用decode和encode來實現。decode是將str編碼方式(如utf-8方式)編碼為unicode字串,而encode是將unicode字串解碼成為str型別,可以指定解碼時所用的編碼方式。

二,字元之間的編碼方式

我們上面講的比較常用的就是ascii編碼,utf-8編碼,gbk編碼(gb2312編碼),而我們說的這些編碼是對於str資料型別來說的,也就是str資料中儲存的就是這些編碼之後的結果,而對於unicode資料型別,儲存的就是unicode編碼的情況,我們可以解碼encode為str資料型別,利用上面制定的編碼方式,而對於str資料型別,我們可以編碼decode為unicode資料型別,但需要指明是從哪個型別轉換過來。

三,我們可以做些什麼來排查問題?

首先,我們對於乙個資料,我們可以通過type來展示資料型別。

print type(variable)
其次,我們可以通過chardet來判斷str資料型別的編碼方式

import chardet

print chardet.detect(variable)

最後,還是可以通過內建函式來實現判斷,也就是isinstance來進行判斷。

print isinstance(s, basestring)
四,我們還是回到python的環境來進行考慮編譯碼的問題。

>>> import sys   

>>> sys.getdefaultencoding()

『ascii『

>>> reload(sys)

>>> sys.setdefaultencoding(『utf-8『)

>>> sys.getdefaultencoding()

『utf-8『

str.encode(『other_coding『)

設定整個系統預設的編碼方式,也就是不單單在本.py指令碼中是採用這種方式編碼,只要編碼方式預設的情況下,我們都預設為這種編碼方式。

python中中文編碼問題

編碼問題一直是很頭痛的問題 當字串是 u4e2d u56fd s u4e2d u56fd u6e05 u534e u5927 u5b66 str s 0 decode unicode escape encode euc kr print str 中國當字串是 東亞學團一中 print unichr ...

Python的中文編碼問題

基本編碼 1 當沒有給定任何編碼提示的時候,python預設使用ascii作為它的標準編碼格式。所以對於中文這樣的非asciii編碼的字元,不指定編碼格式時就會報錯。2 python裡面string型別和unicode型別是兩種不同的型別,string型別的編碼格式就是原始碼的編碼格式,而unico...

Python的中文編碼轉換問題

與伺服器進行資料交換時,尤其是資料中含有中文時,要注意中文的編碼問題。要選擇伺服器接受的編碼方式,否則會造成顯示亂碼。經驗 實驗室伺服器的資料庫,中文用utf 8編碼,但我提交的是gbk編碼的中文,結果出現亂碼 基本能解決大陸上的編碼問題。簡單解釋一下 首先判斷傳入的mes是否是unicode編碼,...