⑴ 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是什麼編碼格式
python編碼總結:
1).首先python有兩種格式的字元串,str和unicode,其中unicode相當於位元組碼那樣,可以跨平台使用。
str轉化為unicode可以通過unicode(),u,str.decode三種方式
unicode轉化為str,如果有中文的話,一般通過encode的方式
2).如果代碼中有中文的話,我們一般會添加 "# coding=utf-8",這個是什麼作用呢,一般如下:
如果代碼中有中文注釋,就需要此聲明比較高級的編輯器(比如我的emacs),會根據頭部聲明,將此作為代碼文件的格式。程序會通過
頭部聲明,解碼初始化 u」人生苦短」,這樣的unicode對象,(所以頭部聲明和代碼的存儲格式要一致
所以,當我們填上編碼頭的時候,使用s="中文",實際上type(s)是一個str,是已經將unicode以utf-8格式編碼成str。
其次,如果我們在代碼中使用s=u'中文',相當於將str以utf-8解碼成unicode。
推薦學習《python教程》。
⑶ python3.3中文亂碼與默認編碼格式設定。
我這邊輸出沒有什麼問題。
下面是輸出:
i = 1
s['statuses'][0]['text'] = 出軌是男人的天性,防小三是女人一生的戰役。
s['statuses'][1]['text'] = 漂亮女孩有時候比普通女孩更可憐。男人可以很坦然的拒絕普通女孩的感情和身體,但是男人會欺騙漂亮女孩的感情從而得到她的身體。這就是為什麼古人說紅顏命薄,你們感受一下。
s['statuses'][2]['text'] = 留幾手教你如何利用空閑時間學習
。。。
i = 2
s['statuses'][20]['text'] = 罵人,其實內容並不重要,一個小蘿莉,滿嘴臟話,也嚇不住人。
。。。
i = 3
s['statuses'][40]['text'] = 我不就是在你家住的時候吃了幾只燒雞沒給你錢么?至於這么編排我么?這情節都是你在哪本言情小說里扒出來的吧?
後面省略了。
前提就是這個樣子的
⑷ 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)
⑸ 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設定系統默認編碼
Python系統默認編碼是ascii,有中文時會有問題,需要修改默認編碼為utf-8,方法如下:
⑺ Python中的幾種特殊數據類型小結
下面介紹了Python中的6種特殊數據類型:
1.list:列表
是一種有序的數據集合,在列表數據結構中的類型並不唯一
定義形式:L=['Micha',100,True]
輸出整個列表的時候顯示為['Micha',100,True]
輸出單個的數值則為:Micha
a.訪問,直接使用L[0]表示第一個元素或者使用L[-1]表示最後一個數據,以此類推,但是注意訪問不能越界(訪問的序號不能超過元素的總數)。
b.添加新元素:使用L.append(100)直接將100加入列表末尾,或者使用L.insert(0,'paul')將paul插入任意位置。
c.刪除元素:L.pop()刪除最後一個元素,或者L.pop(2)刪除第2個位置的元素。
d.替換元素:直接賦值就可以了L[2]=100
2.tuple:元組
是一種有序的列表,但是其一旦創立完畢就不能夠更改,即不能插入,刪除裡面的元素,訪問的方式跟List結構一致。
a.t=()其列印後輸出的形式是()
若t中的數據為一個數字則需要在後面加逗號,以區分普通數字,如t=(1,),列印出(1,)而非1,多元素的話則沒有這個要求。
b.可以在不變的tuple中加入可變的List如t=(『a』,'b',['A','B'])
3.dict:字典
d = {
'Adam': 95,
'Lisa': 85,
'Bart': 59
}
len()函數可以計算任意集合的大小
其中可以簡單地使用d[key]的形式來查找對應的value,這和list很像,不同之處是,list必須使用索引返回對應的元素,而dict使用key,當key不存在的時候,使用該key可能出現錯誤,因此:要避免KeyError發生,有兩個辦法:
一是先判斷一下key是否存在,用in操作符:
if'Paul' in d:
print d['Paul']
如果'Paul'不存在,if語句判斷為False,自然不會執行print d['Paul'],從而避免了錯誤。
二是使用dict本身提供的一個get方法,在Key不存在的時候,返回None:
>>>print d.get('Bart')
59
a.dict中的key不能重復,且dict中的存儲的對應值沒有順序,列印出的東西可能是無序的
b.dict的更新:使用d[『paul']=72求解
c.dict遍歷:
d = {'Adam': 95, 'Lisa': 85, 'Bart': 59 }
>>>for key in d:
...print key
遍歷只能獲得key的值,需要通過key值獲得對應的value
4.set:集合
無序但是所有元素唯一,不重復
a.定義:s = set(['A', 'B', 'C']),查看set的內容:
>>>print s
set(['A','C', 'B'])
可以用in來判斷是否存在於集合中
b.遍歷
s =set([('Adam', 95), ('Lisa', 85), ('Bart', 59)])
for xin s:
print x[0]+':',x[1]
c.添加元素到集合中
s.add(4)
d.刪除元素
s.remove(4)若該元素不在集合中將會報錯
5.Unicode編碼
Python在後來添加了對Unicode的支持,以Unicode表示的字元串用u'...'表示,比如:
printu'中文'
注意:不加u,中文就不能正常顯示中文。
a.轉義形式:u'中文 日文 韓文'
b.輸出多行:
u'''第一行
第二行'''
c.raw+多行的形式:
ur'''Python的Unicode字元串支持"中文",
"日文",
"韓文"等多種語言'''
如果中文字元串在Python環境下遇到UnicodeDecodeError,這是因為.py文件保存的格式有問題。可以在第一行添加註釋
# -*-coding: utf-8 -*-
目的是告訴Python解釋器,用UTF-8編碼讀取源代碼。然後用Notepad++另存為, 並選擇UTF-8格式保存。
6.raw的作用
如果一個字元串包含很多需要轉義的字元,對每一個字元都進行轉義會很麻煩。為了避免這種情況,我們可以在字元串前面加個前綴r,表示這是一個「raw」字元串,裡面的字元就不需要轉義了。例如:
r'(~_~)//'
但是r'...'表示法不能表示多行字元串,也不能表示包含'和"的字元串,如果要表示多行字元串。
⑻ Python字元編碼使用什麼碼
在python 2中默認編碼是ASCII,而在python 3中默認編碼是unicode。
⑼ 關於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里使用UTF-8編碼
在python代碼即.py文件的頭部聲明即可
py文件中的編碼
Python 默認腳本文件都是 ANSCII 編碼的,當文件 中有非 ANSCII 編碼范圍內的字元的時候就要使用"編碼指示"來修正一個 mole 的定義中,如果.py文件中包含中文字元(嚴格的說是含有非anscii字元),則需要在第一行或第二行指定編碼聲明:
# -*- coding=utf-8 -*-
#coding=utf-8
# 以上兩種選其一即可
其他的編碼如:gbk、gb2312也可以;否則會出現:
SyntaxError: Non-ASCII character 'xe4' in file test.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
python中的編碼與解碼
先說一下python中的字元串類型,在python中有兩種字元串類型,分別是 str 和 unicode,他們都是basestring的派生類;
str類型是一個包含Characters represent (at least) 8-bit bytes的序列;
unicode 的每個 unit 是一個 unicode obj;
在str的文檔中有這樣的一句話:
The string data type is also used to represent arrays of bytes, e.g., to hold data read from a file.
也就是說在讀取一個文件的內容,或者從網路上讀取到內容時,保持的對象為str類型;如果想把一個str轉換成特定編碼類型,需要把str轉為Unicode,然後從unicode轉為特定的編碼類型如:utf-8、gb2312等。
utf-8編碼
UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字元編碼,也是一種前綴碼。它可以用來表示Unicode標准中的任何字元,且其編碼中的第一個位元組仍與ASCII兼容,這使得原來處理ASCII字元的軟體無須或只須做少部分修改,即可繼續使用。因此,它逐漸成為電子郵件、網頁及其他存儲或發送文字的應用中,優先採用的編碼。
UTF-8使用一至六個位元組為每個字元編碼(盡管如此,2003年11月UTF-8被RFC 3629重新規范,只能使用原來Unicode定義的區域,U+0000到U+10FFFF,也就是說最多四個位元組):
1、128個US-ASCII字元只需一個位元組編碼(Unicode范圍由U+0000至U+007F)。
2、帶有附加符號的拉丁文、希臘文、西里爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及它拿字母則需要兩個位元組編碼(Unicode范圍由U+0080至U+07FF)。
3、其他基本多文種平面(BMP)中的字元(這包含了大部分常用字,如大部分的漢字)使用三個位元組編碼(Unicode范圍由U+0800至U+FFFF)。
4、其他極少使用的Unicode輔助平面的字元使用四至六位元組編碼(Unicode范圍由U+10000至U+1FFFFF使用四位元組,Unicode范圍由U+200000至U+3FFFFFF使用五位元組,Unicode范圍由U+4000000至U+7FFFFFFF使用六位元組)。
對上述提及的第四種字元而言,UTF-8使用四至六個位元組來編碼似乎太耗費資源了。但UTF-8對所有常用的字元都可以用三個位元組表示,而且它的另一種選擇,UTF-16編碼,對前述的第四種字元同樣需要四個位元組來編碼,所以要決定UTF-8或UTF-16哪種編碼比較有效率,還要視所使用的字元的分布范圍而定。不過,如果使用一些傳統的壓縮系統,比如DEFLATE,則這些不同編碼系統間的的差異就變得微不足道了。若顧及傳統壓縮演算法在壓縮較短文字上的效果不大,可以考慮使用Unicode標准壓縮格式(SCSU)。
互聯網工程工作小組(IETF)要求所有互聯網協議都必須支持UTF-8編碼。互聯網郵件聯盟(IMC)建議所有電子郵件軟體都支持UTF-8編碼。