Python 編碼為什麼那麼蛋疼?

時間 2021-05-05 13:09:53

1樓:知則

簡單來說,所有需要儲存成檔案或者傳輸資訊的地方都用 UTF-8 編碼,所有程式中的變數都是用內建的支援 Unicode 字元的 string 型別,很大一部分這種問題就會消失。如果再注意一下不要直接把編譯後的位元組流當成字串處理,就更好了。

如果你硬是覺得 Unicode 提供的碼表和三套 UTF 編碼方案都滿足不了你的需求。那你的水平顯然不會被這麼一點小問題難倒。很多時候人們都是在自找麻煩。

2樓:Danpier

Python 編碼解碼

Unicode 字元編碼

上兩張圖方便大家直觀地了解 Python 和 Unicode 中編碼解碼的轉換過程。

3樓:索毅

Python中編碼蛋疼的原因,很重要的一點是,Python2和Python3中str的含義完全不一樣

Python2中有兩種字串:str(8位原始位元組碼),Unicode(Unicode),通過`str_string.decode("xx")`,(等價於`str()`) 轉成Unicode,通過`Unicode_string.

encode("xx")`,(等價於`str()`)轉成二進位制。

Python3中有兩種字串:byte(8位原始位元組碼),str(Unicode),byte.decode轉成str,通過str.encode轉成二進位制。

Python2中,如果Unicode只是ASCII碼組成的,本質就跟位元組碼str一致,所以"abc"+u"def"是可行的,結果為Unicode,同時"ab"==u"ab"結果為True,但如果不是是ASCII碼組成的就會報錯。

Python3中byte型別跟str型別不可以直接操作

另外可以使用

>>> import sys

>>> sys.version

看到python的版本

使用 >>> import sys

>>> sys.getdefaultencoding()

看到預設編碼格式,即上文中的"xx"

通過在檔案開頭加入`# coding=utf-8`或者`# -*- coding: utf-8 -*-`,改變預設編碼型別。

對於檔案開頭的注釋,Python通過判斷是否與正規表示式

coding[=:]\s*([-\w.]+)

匹配來判斷是否是檔案的編碼宣告:https://

docs.python.org/3/refer

ence/lexical_analysis.html#encoding-declarations

4樓:

還是看官方的解釋吧,別人咀嚼過了,再吃,還有營養嗎……

Unicode HOWTO - Python 2.7.15 documentation

5樓:

徹底解決

一文說清楚如何處理 Python 的編碼:

6樓:empty.xl

g/編碼問題可以參考我的這篇文章,其實你平常用爬蟲的時候一般只會用到str和bytes(python3)兩種最多再用到gbk 搞清楚原理其實很簡單,你覺得蛋疼可能是python2與python3之間str的含義不同導致的具體解釋可以看我的文章搞清楚其實一點不蛋疼反而很清晰

7樓:WXSB

Python一共支援多少字符集?這裡有個列表

7.8. codecs - Codec registry and base classes - Python 2.7.15 documentation

7.2. codecs - Codec registry and base classes - Python 3.6.6rc1 documentation

這些編碼中,有多少是和ascii 相容的?

我把printable ascii 字元用上述編碼都encode一遍看看。。s=

T.printAsciir=

;re=

foriinT

.gcoding

:try:r

.([i,

s.encode(i

)])except

Exceptionase

:re.([

i,e])

Out[

60]:

[118通過,

2錯誤,120總數]

In[61]:

reOut[61

]:[[

'cp864'

,UnicodeEncodeError

('charmap',u

' !"#$%&

\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[

\\]^_`abcdefghijklmnopqrstuvwxyz~',5

,6,'character maps to '

)],[

'idna'

,UnicodeError

('label empty or too long'

)]]In[62

]:[i[

0]foriin_

]Out[62

]:['cp864'

,'idna'

]ascii 數值是處於 32-126 之間的,我再把編碼後的去除非ascii字元rs=

foriinr

:rs.([

i[0],

''])

forcini

[1]:if

not31

<127:

continuers[

-1][-

1]+=c

ri=[len(i

[1])foriin

rs]data=pd

.Series(ri

)data

.plot

.hist

()plt

.show()

8樓:

各位答主們, 別甩鍋給程式設計師水平了.

我學了不少語言了(8種), 其他語言好像沒有這種問題, 至少不是太突出.

編碼問題算是Python的特色問題了.

9樓:花開開開開開QY

沒辦法,這是計算機的發展帶來了一系列問。不是python所獨有的。 我最近也在學python,看了好多好多的教程,才終於稍微有那麼一點,明白了編碼到底是一種什麼東西。

但是使用的時候,還是需要查教程,查文件。

10樓:喲西

其實更多的是國內的教程只寫了python 2.x編碼問題的表象,而沒有深入其原理。

推薦乙個2.x python編碼處理的最佳實踐:

~在py檔案首行新增# coding=utf8,確保py檔案按照utf8編碼格式解析。

~任何讀取資料流的地方,明確申明資料讀取的編碼或者以二進位制方式讀取後。比如:

· 讀取檔案內容:

codecs.open('file.txt', encoding='gbk')

# gbk是你檔案的編碼

讀取出來的內容為unicode字串

· 直接讀取檔案二進位制內容:

open('file.txt', 'b')

讀取進來的bytes然後再根據具體編碼使用codecs解碼成unicode字串

~Windows下命令列變更code page為65001,即utf8編碼,可以確保程式輸出正常。

chcp 65001

一般產生編碼問題的原因在於沒有指定對資料流編碼或者直接使用只支援ascii字元的str,或者輸出的時候編碼不合適。

在python2.x中處理編碼問題,個人覺得最佳原則就是都使用unicode字元,然後再根據情景轉化成str或者其他編碼

11樓:

不會蛋疼,任何文字資料都可以讀出二進位制檔案,從網頁抓下來的資料直接存入文字,然後讀出二進位制,utf-8 ignore一般沒問題。。。

12樓:xiao li

說python蛋疼的原因是因為unix系統設計的實在太爛了,導致後來繼承它的指令碼語言都是麻煩的。搞什麼ascii碼,直接上utf8不好?

13樓:

因為寫的是爬蟲,別的應用沒有那麼多蛋疼的問題。

有的網頁時用gbk編碼,有的使用utf-8編碼,你獲取到requests的時候就需要做好對應的encoding。

14樓:陳二白

雖然我感覺 python 的編碼問題確實是乙個門檻,但是我覺得也不是特有的,只不過新手不太分得清,什麼是編碼,例如向文筆檔案中儲存uinicode 之類的。儲存的時候儲存的需要有編碼的字串,而讀入的時候需要讀成無編碼格式的。另外一些比較特殊的問題,很多都是儲存讀入的時候沒有按照相應格式化而已。

15樓:

唉多用encode decode

我是這麼解決的

原因是cmd.exe是gpk 不要用gb2312了,用gb148030吧

16樓:石頭三顆

就題目標題來回答:

因為python出來的時候,還沒有unicode。

所以你強行不進化到python3,就只能忍受編碼問題。

17樓:郭寬

@xlzd 的答案很棒,補充一點很多新手會遇到的另乙個編碼問題,就是通過SecureCRT或其他客戶端工具連線遠端機器,可能會發現讀寫檔案都沒有問題,理論上用法也正確,但就是print出來有亂碼。 這個原因可能是因為你的客戶端編碼設定與print出來的資料編碼不一致導致的,很容易讓人誤以為程式出了問題,實際上可以置之不理或者修改一下客戶端工具的編碼即可。

18樓:多顆糖

和樓上說的一樣,是要將Unicode當作中間碼,python2我是這樣解決的:

defdo_request

(req

):res

.urllib2

.urlopen

(req

,timeout=10

)encoding

=res

.headers

['content-type'].

split

('charset=')[-

1]content

=res

.read

()return

unicode

(content

,encoding

)讀下來的就是編碼好的unicode,再轉其它的就OK了。

你也可以直接用瀏覽器開啟url看一下charset,然後按照charset的編碼轉unicode:

19樓:慕楓

抓取網頁時,之前我也經常遇到編碼問題,後來不斷摸索,已經找到所有這類問題的解決方法了。首先,linux預設是utf編碼,windows預設是gbk編碼。然後網頁也有編碼方式。

Unicode作為中間編碼,首先把網頁編碼解碼為Unicode,然後編碼為你的系統編碼.。問題解決!!

20樓:

似乎windows 預設解碼方式是gbk,而你抓取的網頁不是。這就導致錯誤,gbk無法解碼blabla…

先看下網頁編碼方式是什麼,然後用這種編碼方式解碼為unicode就可以了。

另外,這個問題很普遍,你上網一搜一大堆。粗略看下很可能你解決不了。要有耐心。

為什麼基因的編碼很難給出編碼對映?

Biodesign 不想展開,感覺你有些基礎知識掌握有點少,至少看一下中心法則,也就10min的閱讀量,再來提問比較好。就針對你問的東西寫一下。首先,先問是不是,再問有沒有。類似字母語言,英文26個字母的排列組合可以產生出非常多種的意思,那麼ATCG四種鹼基的排列組合也能產生出非常多種表達的RNA或...

你做過的最閒的蛋疼的事是什麼?

秦蜀風雲 前段時間閒了下,就寫了這麼乙份名單。白虎三 中國高校的簡稱,是時候正名了!北京當然是簡稱 京 的,北京大學簡稱為 京大 還能有錯?北京師範大學 北京航空航天大學 天津大學同理。南京大學,南開大學,南昌大學,也應該給予區別的簡稱,對不對?中國科技大學簡稱 科大 是很正統的,畢竟華中科技大學才...

為什麼C 沒有Python那麼多開源庫?

李淵 其實c c 有很多開源庫,但是c c 的開源庫用起來都比較麻煩,所以一般除了那些大的開源庫,其他的小東西都自己寫了,畢竟寫也就半天,學習庫可能就要一天再花半天來呼叫,花半天來確定問題在哪。 塵世之夢 很多python的開源專案都是C 或者C寫的,然後給python乙個呼叫介面,你說這是pyth...