pythonutfgbk
A. python3.4 編碼有哪些
Python3中的編碼問題前,第一個段落對位元組、ASCII與Unicode與UTF-8等進行基本介紹,如果不對這幾種編碼犯頭暈,可直接跳過。
ASCII與Unicode與UTF-8與GBK
首先從老大哥說起。跟很多人一樣,大學讀了這么久,久仰ASCII編碼的大名。要說這個老大哥,我們再先從位元組說起。一個位元組包括八個比特位,每個比特位表示0或1,一個位元組即可表示從00000000到11111111共2^8=256個數字。一個ASCII編碼使用一個位元組(除去位元組的最高位作為作奇偶校驗位),ASCII編碼實際使用一個位元組中的7個比特位來表示字元,共可表示2^7=128個字元。比如那時寫C語言的程序,就經常要背下ASCII編碼中的01000001(即十進制的65)表示字元『A』,01000001加上32之後的01100001(即十進制的97)表示字元『a』。現在打開Python,調用chr和ord函數,我們可以看到Python為我們對ASCII編碼進行了轉換。
第一個00000000表示空字元,因此ASCII編碼實際上只包括了
字母、標點符號、特殊符號等共127個字元。因為ASCII是在美國出生的,對於由字母組成單詞進而用單詞表達的英文來說也是夠了。但是中國人、日本人、
韓國人等其他語言的人不服了。中文是一個字一個字,ASCII編碼用上了渾身解數256個字元都不夠用。
因此後來出現了Unicode編碼。Unicode編碼通常由兩個位元組組成,共表示256*256個字元,即所謂的UCS-2。某些偏僻字還會用到四個位元組,即所謂的UCS-4。也就是說Unicode標准也還在發展。但UCS-4出現的比較少,我們先記住:最原始的ASCII編碼使用一個位元組編碼,但由於語言差異字元眾多,人們用上了兩個位元組,出現了統一的、囊括多國語言的Unicode編碼。
在Unicode中,原本ASCII中的127個字元只需在前面補一個全零的位元組即可,比如前文談到的字元『a』:01100001,在Unicode中變成了00000000 01100001。不久,美國人不開心了,吃上了世界民族之林的大鍋飯,原本只需一個位元組就能傳輸的英文現在變成兩個位元組,非常浪費存儲空間和傳輸速度。
人們再發揮聰明才智,於是出現了UTF-8編碼。因為針對的是空間浪費問題,因此這種UTF-8編碼是可變長短的,從英文字母的一個位元組,到中文的通常的三個位元組,再到某些生僻字的六個位元組。解決了空間問題,UTF-8編碼還有一個神奇的附加功能,那就是兼容了老大哥的ASCII編碼。一些老古董軟體現在在UTF-8編碼中可以繼續工作。
注意除了英文字母相同,漢字在Unicode編碼和UTF-8編碼中通常是不同的。比如漢字的『中』字在Unicode中是01001110
00101101,而在UTF-8編碼中是11100100 10111000
10101101。
我們祖國母親自然也有自己的一套標准。那就是GB2312和GBK。當然現在挺少看到。通常都是直接使用UTF-8。記得我唯一一次看到GB編碼的網頁,是一個成人網站。
Python3中的默認編碼
Python3中默認是UTF-8,我們通過以下代碼:
import sys
sys.getdefaultencoding()
可查看Python3的默認編碼。
Python3中的encode和decode
Python3中字元編碼經常會使用到decode和encode函數。特別是在抓取網頁中,這兩個函數用的熟練非常有好處。我的理解,encode的作用,使我們看到的直觀的字元轉換成計算機內的位元組形式。decode剛好相反,把位元組形式的字元轉換成我們看的懂的、直觀的、「人模人樣」的形式。如下圖。
\x表示後面是十六進制,\xe4\xb8\xad即是二進制的11100100 10111000
10101101。也就是說漢字『中』encode成位元組形式,是11100100 10111000
10101101。同理,我們拿11100100
10111000 10101101也就是\xe4\xb8\xad來decode回來,就是漢字『中』。完整的應該是b'\xe4\xb8\xad',在Python3中,以位元組形式表示的字元串則必須加上前綴b,也就是寫成上文的b'xxxx'形式。
前文說的Python3的默認編碼是UTF-8,所以我們可以看到,Python處理這些字元的時候是以UTF-8來處理的。因此從上圖可以看到,就算我們通過encode('utf-8')特意把字元encode為UTF-8編碼,出來的結果還是相同:b'\xe4\xb8\xad'。
明白了這一點,同時我們知道UTF-8兼容ASCII,我們可以猜想大學時經常背誦的『A』對應ASCII中的65,在這里是不是也能正確的decode出來呢。十進制的65轉換成十六進制是41,我們嘗試下:
b'\x41'.decode()
結果如下。果然是字元『A』
Python3中的編碼轉換
據說字元在計算機的內存中統一是以Unicode編碼的。只有在字元要被寫進文件、存進硬碟或者從伺服器發送至客戶端(例如網頁前端的代碼)時會變成utf-8。但其實我比較關心怎麼把這些字元以Unicode的位元組形式表現出來,露出它在內存中的廬山正面目的。這里有個照妖鏡:
xxxx.encode/decode('unicode-escape')
輸出如下
b'\\u4e2d'還是b'\u4e2d,一個斜杠貌似沒影響。同時可以發現在shell窗口中,直接輸'\u4e2d'和輸入b'\u4e2d'.decode('unicode-escape')是相同的,都會列印出漢字『中』,反而是'\u4e2d'.decode('unicode-escape')會報錯。說明說明Python3不僅支持Unicode,而且一個『\uxxxx』格式的Unicode字元可被辨識且被等價於str類型。
如果我們知道一個Unicode位元組碼,怎麼變成UTF-8的位元組碼呢。懂了以上這些,現在我們就有思路了,先decode,再encode。代碼如下:
xxx.decode('unicode-escape').encode()
測試如下:
可以看到最後輸出的UTF-8位元組與上面的相同。嘗試成功。所以其他的編碼之間的轉換,大概也是如此。
最後的擴展
還記得剛剛那個ord嗎。時代變遷,老大哥ASCII被人合並,但ord還是有用武之地。試試ord('中'),輸出結果是20013。20013是什麼呢,我們再試試hex(ord('中')),輸出結果是'0x4e2d',也就是20013是我們在上文見面了無數次的x4e2d的十進制值。這里說下hex,是用來轉換成十六進制的函數,學過單片機的人對hex肯定不會陌生。
最後的擴展,在網上看到的他人的問題。我們寫下類似於'\u4e2d'的字元,Python3知道我們想表達什麼。但是讓Python讀取某個文件的時候出現了'\u4e2d',是不是計算機就不認識它了呢?後來下文有人給出了答案。如下:
import codecs
file = codecs.open( "a.txt", "r", "unicode-escape" )
u = file.read()
print(u)
B. 如何修改python文件的編碼格式
可以知道的是,文本文件的默認編碼並不是utf8。
我們打開一個文本文件,並點擊另存為
2
我們在新窗口的編碼一欄看到默認編碼是ANSI。先不管這個編碼是什麼編碼,但是通過下拉列表我們知道,這種編碼不是utf8。
END
編碼測試
1
對於Python裡面的中文顯示,我們常常使用utf8和gbk的編碼。對於這兩種編碼筆者就不介紹了,總之都是專門可以處理中文的編碼方式啦。
2
我們首先對文本文件測試了gbk解碼。我們發現,此編碼下文本文件內容可以正常顯示,但是使用utf8解碼,程序出錯,拋出decodeError異常
3
同樣的,我們對Python腳本文件測試了utf8解碼。我們發現,此編碼下文本文件內容可以正常顯示,但是使用gbk解碼,中文部分出現亂碼
4
測試說明,對於文本文件需要使用gbk解碼,而對於腳本文件需要utf8解碼,也就是說,文本文件是gbk編碼的,而腳本則是utf8
C. python2.7 utf-8轉gbk 亂碼
windows的本地默認編碼是cp936(gbk編碼),Windows中直接列印utf-8的字元串是亂碼
將你文件申明為UTF-8保存
#coding:utf-8
def respeak(self):
cText =pyperclip.paste()
gt = cText.decode('utf-8').encode('gbk')
self.ui.mainT.setText(QtCore.QString(gt))
D. Python | 璁劇疆PyCharm鏀鎸佷腑鏂
Python鏈夊緢澶氱涓夋柟瀹夎呭寘錛屽ぇ澶氶兘涓嶈兘鐩存帴鏀鎸佷腑鏂囩紪鐮併備綔涓哄紑鍙戠幆澧冪殑PyCharm鏈夊繀瑕佸崟鐙鐜拌韓璇存硶銆
PyCharm閰嶇疆
PyCharm榛樿Python鑴氭湰緙栫爜鏄疷TF-8錛屾垜浠灝嗗叾璁劇疆涓篏BK錛 榪涘叆filesetting錛屽湪杈撳叆妗嗘悳緔encoding
淇濆瓨璁劇疆騫墮噸鍚疨yCharm錛岃繖鏍烽粯璁ょ紪鐮佸氨鐢熸晥浜嗭紝鍙鍦ㄥ彸涓嬭掓煡鐪
Python 2
絎旇呬嬌鐢ㄧ殑Python鐗堟湰鏄2.7.11銆侾ython 2 鐨勪腑鏂囨敮鎸侀渶瑕佸仛涓や歡浜嬶細 鈶犲湪浠g爜鍓嶇澧炲姞浠g爜錛 # -*-coding:gbk-*- 鈶″湪涓鏂囧墠鍔爑鍓嶇紑錛屽傦細 u"浣犲ソ"
榪愯屼唬鐮侊紝媯鏌ユ槸鍚﹀凡鎴愬姛鏀鎸佷腑鏂囧瓧絎
Python 3
絎旇呬嬌鐢ㄧ殑Python鐗堟湰鏄3.5.1銆侾ython 3 鐨勪腑鏂囨敮鎸佸彧闇瑕佸仛涓浠朵簨鍗沖彲錛 鈶犲湪浠g爜鍓嶇澧炲姞浠g爜錛 # -*-coding:gbk-*-
E. Python字元編碼使用什麼碼
Python 2.x 和 Python 3.x 的字元編碼存在較大的區別。下面將分別介紹它們的編碼原理及相關內容。
Python 2.x 字元編碼
在 Python 2.x 中,str 類型默認使用 ASCII 編碼。ASCII 編碼是在 1960 年代初開發的一種編碼方式,用於將英文字母、數字、符號等字元表示為位元組。由於 ASCII 編碼只使用了 7 位二進制數,因此只能表示 128 種字元。
當需要使用非 ASCII 字元時,在 str 類型前添加 u 前綴,即可將字元串轉換為 Unicode 類型,如下所示:
str1 = 'hello' # 默認使用 ASCII 編碼
str2 = u'你好' # 使用 Unicode 編碼
Python 3.x 字元編碼
在 Python 3.x 中,str 類型默認使用 Unicode 編碼,即 Python 2.x 中的 Unicode 類型。Unicode 編碼是一種支持全球范圍內的字元集,褲歲正能夠表示幾乎所有語言的字元,包括漢字、日文、希臘字母等。
為了支持位元組和 Unicode 類型之間的轉換,Python3.x 新增了 bytes 類型。bytes 類型與 str 類型的區別在於,bytes 類型會自動將字元串轉雀猛換成位元組,而 str 類型會自動將位元組轉換成字元串。
bytes 類型使用 b 前綴表示,如下所示:
str1 = 'hello' # 默認使用胡悔 Unicode 編碼,即 Python 2.x 中的 Unicode 類型
str2 = b'hello' # 使用 bytes 類型
編碼原理及注意事項
字元編碼的原理在於將字元轉換為二進製表示,以便計算機能夠處理。
ASCII 編碼使用 7 位二進制數對字元進行編碼,而 Unicode 編碼使用 16 位或 32 位二進制數對字元進行編碼。
在 Python 中,可以使用 encode 方法將 Unicode 字元串轉換為位元組類型,使用 decode 方法將位元組類型轉換為 Unicode 字元串。編碼方式有多種,如 UTF-8、GBK、Unicode 等,需要根據實際業務需求進行選擇。
UTF-8 編碼是一種常用的 Unicode 字元編碼方式,它使用變長位元組對字元進行編碼,能夠表示幾乎所有的字元。GBK 編碼是一種用於漢字編碼的字元集,只能表示中文字元。
Python 3.x 默認使用 UTF-8 編碼,因此在讀取文件或進行網路傳輸時,需要明確指定編碼方式以避免出現亂碼等問題。
總結
由於字元編碼十分復雜,涉及到的知識點較多,因此學習時需要耐心且注意細節。在使用 Python 進行編程時,需要根據實際情況選擇合適的編碼方式,以避免出現亂碼等問題。
希望我的回答能夠對您有所幫助!
F. 請問,python打開中文字元文件,但顯示不出中文怎麼辦
一般是編碼格式的問題,python內部默認的編碼格式是utf-8,常見的文本編碼格式是utf-8,gbk。編碼格式不不一致就會亂碼。可以在代碼前面申明編碼格式。
G. python utf8 gbk 編碼問題
你是不是想在python里把中文變成鏈接中%E5%BE%85這種形式?直接用urllib.urlencode({'word':'中文'})方法
而顯示\xe5\xbe\x85\是因為你沒有使用read()方法,加上後變成:'待解析網頁'.decode('gbk').encode('utf-8').read(),就是你熟悉的中文了。
不過,'待解析網頁'.decode('gbk').encode('utf-8')這句我要吐槽一下,網頁明顯是utf-8編碼,你在文件開頭聲明utf-8編碼就可以了,這一句是多餘的。在這基礎上讀取網頁直接用 '待解析網頁'.read()
H. python print中文亂碼問題 win10 Python2
python2字元串編碼的問題,如果要輸出中文可以使用u前綴,這樣就可以直接使用了
a=u'你好'
printa
這樣就可以了
I. python怎麼知道一個字元串的編碼方式
字元串的編碼,有很多種如utf-8,gb2312,gbk,gb18030,bz2,zlib,big5,bzse64
python 對編碼的處理有兩個方法,decode()和 encode()方法
a='你好'
b='python'
printa.decode('utf-8').encode('gbk')##decode方法把字元串轉換為unicode對象,然後通過encode方法轉換為指定的編碼字元串對象
printb.decode('utf-8')##decode方法把字元串轉換為unicode對象
所以要讓python(或者說機器)來識別字元串的編碼,是一件很困難的事。編碼就是漢字和整數之間的對應,同一個整數,可以在不同的編碼中,都有對應的漢字。比如下面的例子,比特流'xe6xb0xb4xe5xa3xb6'在四種編碼中都有對應的漢字,但只有在utf-8編碼下,它對應的漢字才有意義。我們可以一眼看出這點,可是要讓計算機做到這點,就很難了。
>>>s='水壺'
>>>s
18:'xe6xb0xb4xe5xa3xb6'
>>>printunicode(s,'big5')
瘞游ㄥ
>>>printunicode(s,'gbk')
姘村6
>>>printunicode(s,'gb2312')
姘村6
>>>printunicode(s,'utf-8')
水壺
J. Python 編碼轉換與中文處理
python 中的 unicode 是讓人很困惑、比較難以理解的問題. 這篇文章 寫的比較好, utf-8是 unicode的一種實現方式,unicode、gbk、gb2312是編碼字元集.
Python 默認腳本文件都是 ANSCII 編碼的,當文件 中有非 ANSCII 編碼范圍內的字元的時候就要使用" 編碼指示 "來修正一個 mole 的定義中,如果.py文件中包含中文字元(嚴格的說是含有非anscii字元),則需要在第一行或第二行指定編碼聲明: # -*- coding=utf-8 -*- 或者 #coding=utf-8
其他的編碼如:gbk、gb2312也可以;否則會出現:
先說一下python中的字元串類型,在python中有兩種字元串類型,分別是 str 和 unicode ,他們都是basestring的派生類;
在str的文檔中有這樣的一句話:
也就是說在讀取一個文件的內容,或者從網路上讀取到內容時,保持的對象為str類型;如果想把一個str轉換成特定編碼類型,需要把str轉為Unicode,然後從unicode轉為特定的編碼類型如:utf-8、gb2312等。
unicode 轉為 gb2312,utf-8等,使用 encode(encoding)
utf-8,GBK轉換為 unicode 使用 unicode(s,encoding) 或者 s.decode(encoding)
普通的 str 轉為 unicode,
如果直接執行s.encode('gb2312')會發生什麼?
這里會發生一個異常:Python 會自動的先將 s 解碼為 unicode ,然後再編碼成 gb2312。因為解碼是python自動進行的,我們沒有指明解碼方式,python 就會使用 sys.defaultencoding 指明的方式來解碼。很多情況下 sys.defaultencoding 是 ANSCII,如果 s 不是這個類型就會出錯。
拿上面的情況來說,我的 sys.defaultencoding 是 anscii,而 s 的編碼方式和文件的編碼方式一致,是 utf8 的,所以出錯了:
對於這種情況,我們有兩種方法來改正錯誤:
s = '中文'
s.decode('utf-8').encode('gb2312') ```
import sys
reload(sys) # Python2.5 初始化後會刪除 sys.setdefaultencoding 這個方法,我們需要重新載入
sys.setdefaultencoding('utf-8')
str = '中文'
str.encode('gb2312')
print open("Test.txt").read()
import codecs
print open("Test.txt").read().decode("utf-8")
Traceback (most recent call last):
File "ChineseTest.py", line 3, in <mole>
print open("Test.txt").read().decode("utf-8")
UnicodeEncodeError: 'gbk' codec can't encode character u'ufeff' in position 0: illegal multibyte sequence
import codecs
data = open("Test.txt").read()
if data[:3] == codecs.BOM_UTF8:
data = data[3:]
print data.decode("utf-8")
s = "中文"
print unicode(s, "utf-8")
Traceback (most recent call last):
File "ChineseTest.py", line 3, in <mole>
s = unicode(s, "utf-8")
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-1: invalid data
s = "中文"
print unicode(s, "gbk")
s = "中文"
print unicode(s, "cp936")