字元編碼亂碼處理

2022-04-08 07:43:15 字數 4442 閱讀 7015

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

print

a ,b,c,d

print(a ,b,c,d) #

注意:使用python2直譯器不能加括號,否者轉換成了二進位制

print

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型別

print

(a ,b,c)

print

(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

'>>> print

(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個月中一直在苦戰。戰爭的原因 大家都知道,吃雞蛋的時候,原始的方法是打破雞蛋較大的一端,可以那時的皇帝的祖父由於小時侯吃雞蛋,按這種方法把手指弄破了,因此他的父親,就下令,命令...