導航:首頁 > 編程語言 > python中的編碼問題

python中的編碼問題

發布時間:2022-09-06 13:08:18

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")

linux python運行報編碼錯誤

一次重啟伺服器後,supervisor接管的python腳本中的函數 open() 和 print() 都會報下面的編碼錯誤:
UnicodeEncodeError: 'ascii' codec can't encode

使用的是python3,按理說編碼都會默認utf-8,而且本地運行的python腳本並沒有這個問題。

經大佬指點,增加環境變數 export LC_ALL="en_US.UTF-8" 後,再重啟supervisor,問題解決

下面是復制的: https://www.cnblogs.com/badboy200800/p/11215981.html

Locale是一個軟體在運行時的語言環境,。是根據計算機用戶所使用的語言,所在國家或者地區,以及當地的文化傳統所定義的。它包括語言(Language), 地域 (Territory) 和字元集(Codeset)。

一個locale的書寫格式為: 語言[ 地域[.字元集]]。完全的locale表達方式是 [語言[ 地域][.字元集] [@修正值]。例如:

zh_CN.GB2312 => 中文_中華人民共和國+國標2312字元集。

(1)locale把按照所涉及到的文化傳統的各個方面分成12個大類

(2)查看標准字元集列表

常用字元集:en_US.utf8、zh_CN.gb2312、zh_CN.gbk、zh_CN.utf8等

3.Locale的設定

LC_ALL和LANG優先順序的關系:LC_ALL > LC_* >LANG
(1)如果需要一個純中文的系統的話,設定LC_ALL= zh_CN.XXXX即可。或者設定LANG=zh_CN.XXXX也可以,但是LC_ 不要有任何特殊設定才可以(因為LC_ 優先順序高)。
(2)如果需要個性化的環境,例如只想要一個可以輸入中文的環境,而保持菜單、標題,系統信息等等為英文界面,那麼只需要設定LANG=en_US.XXXX,然後 LC_CTYPE=zh_CN.XXXX就可以了。
(3)假如什麼也不做的話,也就是LC_ALL,LANG和LC_*均不指定特定值的話,系統將採用POSIX作為lcoale,也就是C locale。

4.查看與設定字元集實踐

(1)查看當前系統字元集三種方式(LC_ALL、LC_CTYPE和LANG),以查看LANG為例:

(2)更改系統字元集

備註:直接執行上述命令,可以臨時修改系統字元集。如果寫入環境變數可以永久改變字元集。

(3)取消當前系統字元集(設定為空)

備註:直接執行上述命令,可以臨時修改系統字元集。如果寫入環境變數可以永久改變字元集。

㈢ python 3.x 編碼問題

你好,簡單來說unicode是字元集,然後utf8是編碼的規則,utf8支持多種字元集,unicode只是其中的一種所以需要明確的說明。
下面是unicode的更多的信息:
首先世界上語言很多,不同語言的編碼不一樣,解碼的結果也不同。而unicode的編號從0一直算到了100多萬(三個位元組)。每一個區間都對應著一種語言的編碼。目前幾乎收納了全世界大部分的字元。所有的字元都有唯一的編號,這就解決了解碼的沖突。但是,unicode把大家都歸納進來,卻沒有為編碼的二進制傳輸和二進制解碼做出規定。

㈣ 新手,求教關於python3編碼的問題

你需要明白兩個概念:

  1. 什麼叫字元串、位元組串

    在Python中字元串是指一串可以展示在終端里、供人閱讀的字元,至於字元採用什麼編碼並不重要,同樣的文字,可能是用Unicode、UTF-8或GBK編碼,但列印在終端中的內容相同,那麼就認為是同一串字元串。而位元組串是指將字元串通過某種編碼轉換得到的一串位元組,同樣一個字元串,使用不同的編碼轉換後得到的位元組串可能完全不同。

  2. 什麼叫encode、decode

    encode中文為編碼,顧名思義,是將字元串以某種編碼形式編碼得到位元組串的過程;相反,decode中文為解碼,是將位元組串以某種編碼形式翻譯得到字元串的過程。

a是一個字元串,它的內容是「周傑倫」這三個字,類型是str;b = a.encode('utf-8')是將a以utf-8形式編碼得到的位元組串,它的內容是「周傑倫」這三個字的utf-8編碼,類型是bytes

㈤ python的編碼問題,一個小例子讓人很困惑

其實,字典中的uxxxx或者x..之類 就是utf-8編碼,經過解碼就是漢字了


print 列印的字元是自動解碼的。(根據第一行的 coding:utf-8)

print 列印的字典、列表之類的對象,一般沒經過解碼


如果你要輸出解碼的漢字,處理方法:

一,對每個scrapy抓取的數據都進行for循環decod

a={1:"你好",2:"謝謝",3:"對不起",4:"hi"}
forkina.keys():
printk,a[k].decode("utf-8")


二,使用json.mps

a={1:"你好",2:"謝謝",3:"對不起",4:"hi"}
importjson
printjson.mps(a,encoding='UTF-8',ensure_ascii=False)

㈥ 請教python 字元串編碼問題

python2.x會存在字元串編碼問題


文件開頭時加入:

# coding:utf-8

如果擔心不生效,可以強制重置一下:

import sys
reload(sys)
sys.setdefaultencoding("utf8")

變數定義時如果涉及到使用中文時,前面加個'u',表示使用unicode編碼

例:
str1=u'大家好'

#coding:utf-8

importsys
reload(sys)
sys.setdefaultencoding("utf8")

str1=u"大家好"
printstr1

㈦ python的參數編碼問題,應該怎麼改

對於name.get_keyphrases()方法,name(也就是代碼中的tr4s)這個參數不能是字元(str),只能是integer 或bytes-like

㈧ 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編碼就能節省空間。

㈨ python編碼的問題

你好:
編碼的問題確實頭疼;
我在博客園摘抄了一些編碼問題;
這個問題主要是因為:
print 是將字元串轉化為系統的編碼輸出。
而list存儲的你設置的編碼。

㈩ 關於python中字元編碼的問題

你說的是,把字元串:
\u3232\u6674
本身,轉換為unicode字元吧?
那麼可以通過:
slashUStr
=
"\\u3232\\u6674";
decodedUniChars
=
slashUStr.decode("unicode-escape");
print
"decodedUniChars=",decodedUniChars;
#decodedUniChars=
(有)

註:(有)
是個特殊字元,如果想要在cmd(默認為gbk)中列印,會出錯的。
UnicodeEncodeError:
'gbk'
codec
can't
encode
character
u'\u3232'
in
position
0:
illegal
multibyte
sequence
但是,本身的確已經是轉換好了unicode字元串了。
詳情可參考:
【整理】Python中,如何將反斜杠u類型(\uXXXX)的字元串,轉換為對應的unicode的字元
(此處不能貼地址,請用google搜標題,即可找到帖子地址)

閱讀全文

與python中的編碼問題相關的資料

熱點內容
死循環會在編譯的時候出錯嗎 瀏覽:984
c51單片機特殊寄存器的原理 瀏覽:576
閃耀永恆特利加密鑰 瀏覽:758
如何誇程序員 瀏覽:776
天津期貨python招聘 瀏覽:263
單片機機器語言寫的程序 瀏覽:548
韓國直播軟體app叫什麼名 瀏覽:916
軍營訓練不聽教官的命令 瀏覽:259
v開頭的音樂播放器是什麼APP 瀏覽:117
單片機是怎麼做出來的 瀏覽:315
博圖怎麼作為opc伺服器 瀏覽:100
編譯做題軟體 瀏覽:293
橋梁檢測pdf 瀏覽:685
化解壓力的一種方法 瀏覽:680
路由器和DSN伺服器有什麼區別 瀏覽:549
android伸縮控制項 瀏覽:853
androidm3u8緩存 瀏覽:236
imphp開源知乎 瀏覽:708
清除網路通配符dos命令 瀏覽:839
鴻蒙系統怎麼快速換回安卓 瀏覽:714