當前位置:首頁 » 編程語言 » pythongbkunicode

pythongbkunicode

發布時間: 2024-09-22 12:24:06

A. python write 寫入為什麼會報這個錯'gbk'codec can't encode character \xbb'i

使用Python寫文件的時候,或者將網路數據流寫入到本地文件的時候,大部分情況下會遇到:UnicodeEncodeError:
'gbk'
codec
can't
encode
character
'\xa0'
in
position
...
這個問題。
網路上有很多類似的文件講述如何解決這個問題,但是無非就是encode,decode相關的,這是導致該問題出現的真正原因嗎?不是的。
很多時候,我們使用了decode和encode,試遍了各種編碼,utf8,utf-8,gbk,gb2312等等,該有的編碼都試遍了,可是編譯的時候仍然出現:
UnicodeEncodeError:
'gbk'
codec
can't
encode
character
'\xa0'
in
position
XXX。
崩潰了。
在windows下面編寫python腳本,編碼問題很嚴重。
將網路數據流寫入文件時時,我們會遇到幾個編碼:
1:
#encoding='XXX'
這里(也就是python文件第一行的內容)的編碼是指該python腳本文件本身的編碼,無關緊要。只要XXX和文件本身的編碼相同就行了。
比如notepad++
"格式"菜單裡面里可以設置各種編碼,這時需要保證該菜單里設置的編碼和encoding
XXX相同就行了,不同的話會報錯
2:網路數據流的編碼
比如獲取網頁,那麼網路數據流的編碼就是網頁的編碼。需要使用decode解碼成unicode編碼。
3:目標文件的編碼
要將網路數據流的編碼寫入到新文件,那麼我么需要指定新文件的編碼。寫文件代碼如:
復制代碼代碼如下:
f.write(txt)
,那麼txt是一個字元串,它是通過decode解碼過的字元串。關鍵點就要來了:目標文件的編碼是導致標題所指問題的罪魁禍首。如果我們打開一個文件:
復制代碼代碼如下:
f
=
open("out.html","w")
,在windows下面,新文件的默認編碼是gbk,這樣的話,python解釋器會用gbk編碼去解析我們的網路數據流txt,然而txt此時已經是decode過的unicode編碼,這樣的話就會導致解析不了,出現上述問題。
解決的辦法就是,改變目標文件的編碼:
復制代碼代碼如下:
f
=
open("out.html","w",encoding='utf-8')

B. python怎麼轉換unicode編碼

用decode()就行。decode()方法必須傳入一個參數,這個參數就是當前待轉碼的編碼,此函數方法的用意就是將當前編碼為Unicode編碼。

比如就你這提問的此頁面:

#使用版本是python2.
importurllib
url='https://..com/question/1499967322379602619.html?entry=qb_ihome_tag&hideOtherAnswer=true&newAnswer=1'
html=urllib.urlopen(url).read()
result=html.decode('gbk')
printresult

方法是絕對可行的

此法對字元串和文檔內容的解碼一樣有效。

C. 執行python腳本出現亂碼怎麼解決

執行python腳本出現亂碼的解決方法:首先把中文解碼為unicode,具體方法如:【decode('utf-8')】;然後再轉化為gbk即可,具體方法如:【encode('gbk')】。
問題:
代碼中指定了UTF-8編碼,但是在cmd命令行窗口時列印的中文仍然會亂碼。
(推薦教程:Python入門教程)
原因:
windows下中文默認的輸出編碼為gbk ,與腳本中定義的UTF-8不一樣,所以出現了解碼失敗的情況。
解決方法:
可以先把中文解碼為unicode,然後再轉化為gbk來解決這個問題。
舉例:
運行結果:

D. python中unicode編碼有多少(2023年最新解答)

導讀:今天首席CTO筆記來給各位分享關於python中unicode編碼有多少的相關內容,如果能碰巧解決你現在面臨的問題,別忘了關注本站,現在開始吧!

python有哪幾種編碼方式

第一種:ASCII碼。是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言,它是現今最通用的單位元組編碼系統,並等同於國際標准IS/IEC

646。

由於計算機是美國人發明的,因此,最早只有127個字母被編碼到計算機李,也就是大小寫英文字母、數字和一些符號,這個編碼表被稱為ASCII編碼,比如大寫字母A的編碼是65,小寫字母a的編碼是97,後128個稱為擴展ASCII碼。

第二種:GBK和GB2312。能在計算機中顯示中文字元是至關重要的,然而ASCII表裡一個偏旁部首都沒有,所以我們需要一個關於中文和數字對應的關系表,一個位元組只能最多表示256個字元,用處理中文顯然一個位元組是不夠的,所以我們需要採用兩個位元組來表示,所以中國制定了GB2312編碼,用來將中文編寫進去。

第三種:Unicode。因為各個國家都有一套自己的編碼,所以無法避免沖突,因此Unicode誕生了。它可以把所有語言都統一到一套編碼里,這樣就不會存在亂碼問題了,現代操作系統和大多數編程語言都直接支持Unicode。

第四種:UFT-8。基於節約的原則,出現了把Unicode編碼轉化為可變長編碼的UTF-8編碼。而UTF-8編碼把一個Unicode字元根據不同的數字大小編碼成1-6個位元組,常用的英文字母被編碼成一個位元組,漢字通常是3個位元組,只有很生僻的字元才會被編碼成4-6個位元組,如果你要傳輸的文本包含大量英文字元,用UTF-8編碼就能節省空間。

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中變成了0000000001100001。不久,美國人不開心了,吃上了世界民族之林的大鍋飯,原本只需一個位元組就能傳輸的英文現在變成兩個位元組,非常浪費存儲空間和傳輸速度。

人們再發揮聰明才智,於是出現了UTF-8編碼。因為針對的是空間浪費問題,因此這種UTF-8編碼是可變長短的,從英文字母的一個位元組,到中文的通常的三個位元組,再到某些生僻字的六個位元組。解決了空間問題,UTF-8編碼還有一個神奇的附加功能,那就是兼容了老大哥的ASCII編碼。一些老古董軟體現在在UTF-8編碼中可以繼續工作。

注意除了英文字母相同,漢字在Unicode編碼和UTF-8編碼中通常是不同的。比如漢字的『中』字在Unicode中是01001110

00101101,而在UTF-8編碼中是1110010010111000

10101101。

我們祖國母親自然也有自己的一套標准。那就是GB2312和GBK。當然現在挺少看到。通常都是直接使用UTF-8。記得我唯一一次看到GB編碼的網頁,是一個成人網站。

Python3中的默認編碼

Python3中默認是UTF-8,我們通過以下代碼:

importsys

sys.getdefaultencoding()

可查看Python3的默認編碼。

Python3中的encode和decode

Python3中字元編碼經常會使用到decode和encode函數。特別是在抓取網頁中,這兩個函數用的熟練非常有好處。我的理解,encode的作用,使我們看到的直觀的字元轉換成計算機內的位元組形式。decode剛好相反,把位元組形式的字元轉換成我們看的懂的、直觀的、「人模人樣」的形式。如下圖。

x表示後面是十六進制,xe4xb8xad即是二進制的1110010010111000

10101101。也就是說漢字『中』encode成位元組形式,是1110010010111000

10101101。同理,我們拿11100100

1011100010101101也就是xe4xb8xad來decode回來,就是漢字『中』。完整的應該是b'xe4xb8xad',在Python3中,以位元組形式表示的字元串則必須加上前綴b,也就是寫成上文的b'xxxx'形式。

前文說的Python3的默認編碼是UTF-8,所以我們可以看到,Python處理這些字元的時候是以UTF-8來處理的。因此從上圖可以看到,就算我們通過encode('utf-8')特意把字元encode為UTF-8編碼,出來的結果還是相同:b'xe4xb8xad'。

明白了這一點,同時我們知道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('中')),輸出結果是Ɔx4e2d',也就是20013是我們在上文見面了無數次的x4e2d的十進制值。這里說下hex,是用來轉換成十六進制的函數,學過單片機的人對hex肯定不會陌生。

最後的擴展,在網上看到的他人的問題。我們寫下類似於'u4e2d'的字元,Python3知道我們想表達什麼。但是讓Python讀取某個文件的時候出現了'u4e2d',是不是計算機就不認識它了呢?後來下文有人給出了答案。如下:

importcodecs

file=codecs.open("a.txt","r","unicode-escape")

u=file.read()

print(u)

python123漢字的unicode編碼值

python的默認編碼是ascii,可以通過sys.setdefaultencoding('utf-8')函數設置python的默認編碼。

python中可以通過encode和decode的方式改變數據的編碼,比如:

u'漢字'

u'u6c49u5b57'

u'漢字'.encode('utf-8')

'xe6xb1x89xe5xadx97'

u'漢字'.encode('utf-8').decode('utf-8')

u'u6c49u5b57'

我們可以通過這兩個函數設置編碼。

那麼,python中的str是什麼類型?

importbinascii

'漢字'

'xbaxbaxd7xd6'

type('漢字')

printbinascii.b2a_hex('漢字')

babad7d6

printbinascii.b2a_hex(u'漢字')

Traceback(mostrecentcalllast):

File"",line1,in

UnicodeEncodeError:'ascii'codeccan'tencodecharactersin

position0-1:ordinalnotinrange(128)

printbinascii.b2a_hex(u'漢字'.encode('utf-8'))

e6b189e5ad97

printbinascii.b2a_hex(u'漢字'.encode('gbk'))

babad7d6

binascii是將數據的二進制轉換成ascii,上面的解釋是:『漢字'的類型是str,二進制是babad7d6,u『漢字'是無法轉換成ascii,這樣就報出了開頭的第一個錯誤。解決辦法就是把它.encode(『utf-8')成str類型。因為我命令行是windows默認的GBK編碼,所有u'漢字'.encode(『gbk')的時候,輸出結果和『漢字'結果一樣。

python程序採用unicode編碼,一個中文字元對應幾個

python程序採用unicode編碼,一個中文字元對應兩個位元組。Unicode編碼中,一個英文等於兩個位元組,一個中文(含繁體)等於兩個位元組。

結語:以上就是首席CTO筆記為大家整理的關於python中unicode編碼有多少的相關內容解答匯總了,希望對您有所幫助!如果解決了您的問題歡迎分享給更多關注此問題的朋友喔~

熱點內容
ftp錯誤無法獲得遠端文件夾信息 發布:2024-09-22 14:20:19 瀏覽:124
如何在安卓服看到白鳥 發布:2024-09-22 14:20:16 瀏覽:220
仿回車源碼 發布:2024-09-22 14:01:14 瀏覽:518
mysql資料庫索引原理 發布:2024-09-22 13:58:55 瀏覽:22
android照片旋轉 發布:2024-09-22 13:53:39 瀏覽:443
編程大牛 發布:2024-09-22 13:49:08 瀏覽:720
為什麼電腦彈出代理伺服器錯誤 發布:2024-09-22 13:48:21 瀏覽:385
我的世界啟動器推薦伺服器地址 發布:2024-09-22 13:44:09 瀏覽:638
c語言中的unsignedchar 發布:2024-09-22 13:11:12 瀏覽:169
最好的加密移動硬碟 發布:2024-09-22 12:35:58 瀏覽:157