python3預設編碼是unicode;而python2是ascii碼。windows環境預設是gbk編碼。
1. python直譯器的預設編碼
2. python原始檔檔案編碼
3. terminal使用的編碼
4. 作業系統的語言設定
一、 編碼的種類
i、ascii 佔1個位元組,只支援英文
ii、gb2312 佔2個位元組,支援6700+漢字
iii、gbk gb2312的公升級版,支援21000+漢字,中文2個位元組。
iv、unicode 2-4位元組 已經收錄136690個字元
v、utf-8: 使用1、2、3、4個位元組表示所有字元;優先使用1個字元、無法滿足則使增加乙個位元組,最多4個位元組。英文佔1個字
vi、utf-16: 使用2、4個位元組表示所有字元;優先使用2個位元組,否則使用4個位元組表示。
二、 python3的執行過程
1.直譯器找到**檔案,把**字串按檔案頭定義的編碼載入到記憶體,轉成unicode
2.把**字串按照語法規則進行解釋,
3.所有的變數字元都會以unicode編碼宣告
py3 自動把檔案編碼轉為unicode,python2並不會自動的把檔案編碼轉為unicode存在記憶體裡。需要手動轉碼。
三、手動轉碼規則
utf-8 --> decode 解碼 --> unicode
unicode --> encode 編碼 --> gbk / utf-8 等
使用type可以檢視編碼形式,unicode是『unicode』,gbk和utf-8是『str或bytes』。
例項:python2中預設是ascii碼
#coding=utf-8
#python2中預設是ascii碼,一般會加入以utf-8程式設計
a = '編碼'
#a是utf-8型別
b = a.decode('
utf-8
') #
b是unicode型別
c = b.encode('
gbk') #
c是gbk型別
d = c.decode('
gbk').encode('
utf-8
') #
先將c轉換成unicode,再轉成utf-8
a ,b,c,d
print(a ,b,c,d) #
注意:使用python2直譯器不能加括號,否者轉換成了二進位制
type(a),type(b),type(c),type(d)
'''注意:在pycharm裡使用python2時,通常需要以unicode作為中間編碼,即先將其他編碼
的字元解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼,這裡在從unicode編
碼(encode)成gbk編碼時,終端顯示會出現亂碼,只能在window命令列啟動python2直譯器
才能正常顯示該字元。
''''''
編碼 編碼 ���� 編碼
('\xe7\xbc\x96\xe7\xa0\x81', u'\u7f16\u7801', '\xb1\xe0\xc2\xeb', '\xe7\xbc\x96\xe7\xa0\x81')
'''
python3中預設是unicode
a = '編碼'#a是unicode型別
b = a.encode('
utf-8
') #
b是utf-8型別
c = a.encode('
gbk') #
c是gbk型別
(a ,b,c)
(type(a),type(b),type(c))
#python3預設是unicode型別
'''編碼 b'\xe7\xbc\x96\xe7\xa0\x81' b'\xb1\xe0\xc2\xeb'
'''
在windows cmd視窗下啟動python2 預設gbk
>>> a = '編碼'>>> b = a.decode('
gbk') #
windows預設是gbk,先解碼成unicode
>>> c = b.encode('
utf-8
') #
unicode轉換成utf-8
>>>a
'\xb1\xe0\xc2\xeb
'>>>bu'
\u7f16\u7801
'>>>c
'\xe7\xbc\x96\xe7\xa0\x81
(a,b,c)('
\xb1\xe0\xc2\xeb
', u'
\u7f16\u7801
', '
\xe7\xbc\x96\xe7\xa0\x81')
>>>type(a)
'str
'>
>>>type(b)
'unicode
'>
>>>type(c)
'str
'>
字串在python內部的表示是unicode編碼,因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字元解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。
decode的作用是將其他編碼的字元轉換成unicode編碼,如str1,decode('gb2312'),表示將gb2312編碼的字串str1轉換成unicode編碼。
encode的作用是將unicode編碼轉換成其他編碼的字串,如str2,encode('gb2312'),表示將unicode編碼的字串str2轉換成gb2312編碼。
因此,轉碼的時候一定要明白,字串str是什麼編碼,然後decode成unicode編碼,然後再encode成其他編碼。
通常,在沒有指定特定的編碼方式時,都是使用的系統預設編碼建立的**檔案。
如:s = '中文'
在utf8檔案中,該字串就是utf8編碼了;
在gb2312檔案中,該字串就是gb2312編碼了;
如字串是這樣定義: s =u'中文',則該字串的編碼就被指定為unicode編碼了,即python的內部編碼,而與**檔案本身的編碼無關,因此,對於這種情況做編碼轉換,只需直接使用encode
方法將其轉換成指定編碼即可。
如果乙個字串已經是unicode了,再進行解碼則將出錯,因此通常要對其編碼方式是否為unicode進行判斷:
isinstance(s,unicode) # 用來判斷是否為unicode
------->> 用非unicode編碼形式的str來encode會報錯
--如何獲得系統的預設編碼:
# !/usr/bin/env python #coding=utf-8 import sys print sys.getdefaultencoding()
字串在python內部的表示是unicode編碼,因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字元解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。
decode的作用是將其他編碼的字元轉換成unicode編碼,如str1,decode('gb2312'),表示將gb2312編碼的字串str1轉換成unicode編碼。
encode的作用是將unicode編碼轉換成其他編碼的字串,如str2,encode('gb2312'),表示將unicode編碼的字串str2轉換成gb2312編碼。
因此,轉碼的時候一定要明白,字串str是什麼編碼,然後decode成unicode編碼,然後再encode成其他編碼。
通常,在沒有指定特定的編碼方式時,都是使用的系統預設編碼建立的**檔案。
如:s = '中文'
在utf8檔案中,該字串就是utf8編碼了;
在gb2312檔案中,該字串就是gb2312編碼了;
如字串是這樣定義: s =u'中文',則該字串的編碼就被指定為unicode編碼了,即python的內部編碼,而與**檔案本身的編碼無關,因此,對於這種情況做編碼轉換,只需直接使用encode
方法將其轉換成指定編碼即可。
如果乙個字串已經是unicode了,再進行解碼則將出錯,因此通常要對其編碼方式是否為unicode進行判斷:
isinstance(s,unicode) # 用來判斷是否為unicode
------->> 用非unicode編碼形式的str來encode會報錯
--如何獲得系統的預設編碼:
# !/usr/bin/env python #coding=utf-8 import sys print sys.getdefaultencoding()
CSS字元編碼引起亂碼
亂碼引起的css失效原理 由於乙個中文是兩個字元組成,在編碼不一致的情況下會引發字元的 重新 組合,半個漢字的編碼字元與後面的字元組合生成新的 文字 引發原本的結束符合 變異 從而導致找不到結束符號,使得後面的css就會失效。小技巧1 css中出現的亂碼都是由於css字元編碼與頁面的字元編碼不一致所...
Qt 字元編碼 亂碼總結
cpp view plain copy qtextcodec setcodecforcstrings qtextcodec codecforname utf 8 qtextcodec setcodecforlocale qtextcodec codecforname utf 8 qtextcodec...
字元編碼附屬亂碼篇
還是先從乙個故事開始吧。jonathan swift的 格利佛遊記 lilliput和blefuscu這兩個強國在過去的36個月中一直在苦戰。戰爭的原因 大家都知道,吃雞蛋的時候,原始的方法是打破雞蛋較大的一端,可以那時的皇帝的祖父由於小時侯吃雞蛋,按這種方法把手指弄破了,因此他的父親,就下令,命令...