日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

python字符串编码及乱码解决方案(Python.org)

發布時間:2023/12/15 综合教程 39 生活家
生活随笔 收集整理的這篇文章主要介紹了 python字符串编码及乱码解决方案(Python.org) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://blog.csdn.net/pipisorry/article/details/44136297

字符編碼詳解

[字符編碼ASCII,Unicode和UTF-8]

主要非英文字符集的編碼范圍

范圍 編碼 說明
2E80~33FFh 中日韓符號區

收容康熙字典部首、中日韓輔助部首、注音符號、日本假名、韓文音符,

中日韓的符號、標點、帶圈或帶括符文數字、月份,

以及日本的假名組合、單位、年號、月份、日期、時間等。

3400~4DFFh 中日韓認同文字擴充A區 中日韓認同表意文字擴充A區,總計收容6,582個中日韓漢字。
4E00~9FFFh 中日韓認同表意文字區 中日韓認同表意文字區,總計收容20,902個中日韓漢字。
A000~A4FFh 彝族文字區 收容中國南方彝族文字和字根
AC00~D7FFh 韓文拼音組合字區 收容以韓文音符拼成的文字
F900~FAFFh 中日韓兼容表意文字區 總計收容302個中日韓漢字
FB00~FFFDh 文字表現形式區

收容組合拉丁文字、希伯來文、阿拉伯文、中日韓直式標點、小符號、

半角符號、全角符號等。

匹配所有中日韓非符號字符,那么正則表達式應該是^[\u2E80-\u9FFF]+$, 包括我們臺灣省還在盲目使用的繁體中文。中文的正則表達式, 應該是^[\u4E00-\u9FFF]+$,需要注意的是^[\u4E00-\u9FA5]+$這是專門用于匹配簡體中文的正則表達式, 實際上繁體字也在里面, 也通過了, 當然, ^[\u4E00-\u9FFF]+$也是一樣的結果。

皮皮Blog

Python源碼的編碼方式

str與字節碼

s = "人生苦短"

s是個字符串,它本身存儲的就是字節碼(這個s定義在文件中的一行,或者命令行中的一行)。那么這個字節碼是什么格式的?

如果這段代碼是在解釋器上輸入的,那么這個s的格式就是解釋器的編碼格式,對于windows的cmd而言,就是gbk。

如果將段代碼是保存后才執行的,比如存儲為utf-8,那么在解釋器載入這段程序的時候,就會將s初始化為utf-8編碼。

unicode與str

我們知道unicode是一種編碼標準,具體的實現標準可能是utf-8,utf-16,gbk ……

python 在內部使用兩個字節來存儲一個unicode,使用unicode對象而不是str的好處,就是unicode方便于跨平臺。

你可以用如下兩種方式定義一個unicode:(在python2中)

1 s1 = u"人生苦短"
2 s2 = unicode("人生苦短", "utf-8")

python3

字符串實際就是用的unicode,直接s = “人生苦短”

Note: py3定義bytes使用sb = b’dfja’

python 2.x和3.x中的字符串編碼區別

2.x中字符串有str和unicode兩種類型,str有各種編碼區別,unicode是沒有編碼的標準形式。unicode通過編碼轉化成str,str通過解碼轉化成unicode。

3.x中將字符串和字節序列做了區別,字符串str是字符串標準形式與2.x中unicode類似,bytes類似2.x中的str有各種編碼區別。bytes通過解碼轉化成str,str通過編碼轉化成bytes。

2.x中可以查看unicode字節序列,3.x中不能。

Python 2:Python 2的源碼.py文件默認的編碼方式為ASCII

如果想使用一種不同的編碼方式來保存Python代碼,我們可以在每個文件的第一行放置編碼聲明(encoding declaration)。

以下聲明定義.py文件使用windows-1252編碼方式:# -*- coding: windows-1252 -*-

Note: 1. 從技術上說,字符編碼的重載聲明也可以放在第二行,如果第一行被類UNIX系統中的hash-bang命令占用了。

2. 了解更多信息,請參閱PEP263: 指定Python源碼的編碼方式。

Python 3:Python 3的源碼.py文件 的默認編碼方式為UTF-8

Python 3.x中的Unicode

在Python 3.0之后的版本中,所有的字符串都是使用Unicode編碼的字符串序列,同時還有以下幾個改進:

1、默認編碼格式改為unicode

2、所有的Python內置模塊都支持unicode

3、不再支持u中文的語法格式

所以,對于Python 3.x來說,編碼問題已經不再是個大的問題,基本上很少遇到編碼異常。

在Python 3,所有的字符串都是使用Unicode編碼的字符序列。不再存在以UTF-8或者CP-1252編碼的情況。也就是說,這個字符串是以UTF-8編碼的嗎?不再是一個有效問題。UTF-8是一種將字符編碼成字節序列的方式。如果需要將字符串轉換成特定編碼的字節序列,Python 3可以為你做到。如果需要將一個字節序列轉換成字符串,Python 3也能為你做到。字節即字節,并非字符。字符在計算機內只是一種抽象。字符串則是一種抽象的序列。

>>> s = "深入 Python"
>>> len(s)
9
>>> s[0]
"深"
>>> s + " 3"
"深入 Python 3"s = "深入 Python"
>>> len(s)
9
>>> s[0]
"深"
>>> s + " 3"
"深入 Python 3"
  1. Python中,字符串可以想像成由字符組成的元組。

  2. Just like getting individual items out of a list, you can get individual characters out of a string using index notation.
    與取得列表中的元素一樣,也可以通過下標記號取得字符串中的某個字符。

文件頭聲明編碼

關于python文件頭部分知識的講解

頂部的:# -*- coding: utf-8 -*-或者# coding: utf-8目前有三個作用

  1. 如果代碼中有中文注釋,就需要此聲明。
  2. 比較高級的編輯器(比如我的emacs),會根據頭部聲明,將此作為代碼文件的格式。
  3. 程序會通過頭部聲明,解碼初始化 u”人生苦短”,這樣的unicode對象,(所以頭部聲明和代碼的存儲格式要一致)。

Example2

url編碼

通過urllib.parse.quote 將字節序列轉化成url的中文編碼形式,逆過程是unquote函數。

  1. >>>importurllib.parse

  2. >>>res=urllib.parse.quote(utfs)

  3. >>>res

  4. ‘%E5%8C%97%E4%BA%AC%E5%B8%82’

皮皮Blog

Python編碼錯誤及解決方法

字符串是Python中最常用的數據類型,而且很多時候你會用到一些不屬于標準ASCII字符集的字符,這時候代碼就很可能拋出UnicodeDecodeError: ascii codec cant decode byte 0xc4 in position 10: ordinal not in range(128)異常。這種異常在Python中很容易遇到,尤其是在Python2.x中。

字符串在Python內部的表示是unicode編碼,因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字符串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。但是,Python 2.x的默認編碼格式是ASCII,就是說,在沒有指定 Python源碼編碼格式的情況下,源碼中的所有字符都會被默認為ASCII碼。也因為這個根本原因,在Python 2.x中經常會遇UnicodeDecodeError或者UnicodeEncodeError的異常。

Unicode為了能夠處理Unicode數據,同時兼容Python某些內部模塊,Python 2.x中提供了Unicode這種數據類型,通過decode和encode方法可以將其它編碼和Unicode編碼相互轉化,但同時也引入了UnicodeDecodeError和UnicodeEncodeError異常。

python編碼異常解決原則

1、終極原則:遵循PEP0263原則,聲明編碼格式 且 decode early, unicode everywhere, encode late

首先需要在文件頭部聲明編碼:# -*- coding: <encoding name> -*-

在PEP 0263 Defining Python Source Code Encodings中提出了對Python編碼問題的最基本的解決方法:在Python源碼文件中聲明編碼格式,最常見的聲明方式如下:

#!/usr/bin/python

# -*- coding: <encoding name> -*-

Note:其中<encoding name>是代碼所需要的編碼格式,它可以是任意一種Python支持的格式,一般都會使用utf-8的編碼格式。# -*- coding: utf-8 -*-是Python文件聲明,意思是:當前.py文件中所有的字符串是utf-8編碼的,所以文件中的字符需要使用utf-8解碼成unicode!

decode early, unicode everywhere, encode late

在輸入或者聲明字符串的時候,盡早地使用decode方法將字符串轉化成unicode編碼格式(當然除了本身就是unicode的字符);然后在程序內統一使用unicode格式進行處理,比如字符串拼接、字符串替換、獲取字符串的長度、正則表達式等操作;最后,在return、輸出字符串的時候(控制臺/網頁/文件),通過encode方法將字符串轉化為你所想要的編碼格式/輸入時的編碼格式。按照這個原則處理Python的字符串,基本上可以解決所有的編碼問題。

獲取字符串編碼:

        input_encoding = 'utf-8'
        encodings = ['ascii', 'utf-8', 'gb2312', 'windows-1250', 'windows-1252']
        for e in encodings:
            try:
                source = source.decode(e)
                group_patterns = [g.decode(e) for g in group_patterns]
            except UnicodeDecodeError:
                continue
            else:
                print('str encoding:  %s ' % e)
                input_encoding = e
                break

或者安裝chardet庫

        import chardet
        input_encoding = chardet.detect(source)['encoding']
        source = source.decode(chardet.detect(source)['encoding'])
        group_patterns = [g.decode(chardet.detect(g)['encoding']) for g in group_patterns]

但是這個庫有時候識別會出錯(畢竟是概率算法),如下面識別不了gbk:

print(chardet.detect(u'黑頭'.encode('gbk'))['encoding'])
print(u'黑頭'.encode('gbk').decode(chardet.detect(u'黑頭'.encode('gbk'))['encoding']).encode('gbk'))

輸出KOI8-R
?l???i

另外還應該使用codecs模塊打開文件,內置的open函數打開文件時,read方法讀取的是一個str(私以為叫做字節數組更合適),如果讀取的是其它編碼的文字,則需要decode之后再做使用。

對于使用open函數打開文件之后的寫操作(多字節編碼的字符串),則需要將需要寫入的字符串按照其編碼encode為一個str,如果直接寫入,則會引發如下錯誤(如果在代碼中加入了encoding聲明,則會按照聲明的編碼格式encode后寫入):

除此以外,codecs模塊也提供了一個open函數,可以直接指定好編碼打開一個文本文件,那么讀取到的文件內容則直接是一個unicode字符串。對應的指定編碼后的寫入文件,則可以直接將unicode寫到文件中。通過codecs.open可以避免很多編碼問題:

2、Reset默認編碼

python中設置默認編碼defaultencoding。Python中出現這么多編碼問題的根本原因是Python 2.x的默認編碼格式是ASCII,是許多錯誤的原因,所以你也可以通過以下的方式修改默認的編碼格式:

import sys

sys.setdefaultencoding(utf-8)

如果你在python中進行編碼和解碼的時候,不指定編碼方式,那么python就會使用defaultencoding。比如將str編碼為另一種格式,就會使用defaultencoding。

s.encode("utf-8") 等價于 s.decode(defaultencoding).encode("utf-8")

Note: 這個過程是s先通過defaultencoding解碼為unicode,再編碼為utf-8類型的編碼。

再比如你使用str創建unicode對象時,如果不說明這個str的編碼格式,那么程序也會使用defaultencoding。

u = unicode("人生苦短") 等價于 u = unicode("人生苦短",defaultencoding)

Note: 可以解決部分編碼問題,但是同時也可能引入很多其他問題。

3、使用u中文替代中文(py2)

str1 = ‘中文編碼’

str2 = u’中文編碼’

Python中有以上兩種聲明字符串變量的方式,它們的主要區別是編碼格式的不同,其中,str1的編碼格式和Python文件聲明的編碼格式一致,而str2的編碼格式則是Unicode。如果你要聲明的字符串變量中存在非ASCII的字符,那么最好使用str2的聲明格式,這樣你就可以不需要執行decode,直接對字符串進行操作,可以避免一些出現異常的情況。

Note: python3不支持u的聲明方式。

4、升級Python 2.x到3.x

主要是因為Python 2.x的編碼設計問題。當然,升級到Python 3.x肯定可以解決大部分因為編碼產生的異常問題。畢竟Python 3.x版本對字符串這部分還是做了相當大的改進的。

原因參見前面關于python2.x和3.x的區別。

常見編碼異常

常見編碼異常

Python中常見的幾種編碼異常有SyntaxError: Non-ASCII character、UnicodeDecodeError和UnicodeEncodeError等(幾乎都只存在于python2中)。 python3基本沒有編碼異常,只要在頭部聲明# -*- coding: utf-8 -*-,python源代碼中的字符就是utf-8,不需要decode encode。

1、SyntaxError: Non-ASCII character

這種異常主要原因是Python源碼文件中有非ASCII字符,而且同時沒有聲明源碼編碼格式,例如:

s = ‘中文’

print s

# 拋出異常

解決: 文件頭部聲明編碼# -*- coding: utf-8 -*-

Python2中,如果在源碼首行(或在指定sha-bang時的第二行)不顯式指定編碼,則無法在源碼中出現非ASCII字符。這是由于Python2解釋器默認將源碼認作ASCII編碼格式。[PEP263]

2、UnicodeDecodeError

這個異常有時候會在調用decode方法時出現,原因是Python打算將其他編碼的字符轉化為Unicode編碼,但是字符本身的編碼格式和decode方法傳入的編碼格式不一致,例如:

#!/usr/bin/python

# -*- coding: utf-8 -*-

s = ‘中文’

s.decode(‘gb2312’)

#UnicodeDecodeError: gb2312 codec cant decode bytes in position 2-3: illegal multibyte sequenceprint s

Note:上面這段代碼中字符串s的編碼格式是utf-8(# -*- coding: utf-8 -*-聲明的意思是:當前.py文件中所有的字符串是utf-8編碼的),但是在使用decode方法轉化為Unicode編碼時傳入的參數是‘gb2312’,因此在轉化的時候拋出UnicodeDecodeError異常。

還有一種情況是在encode的時候:

#!/usr/bin/python

# -*- coding: utf-8 -*-

s = ‘中文’

s.encode(‘gb2312’)

# UnicodeDecodeError: ascii codec cant decode byte 0xe4 in position 0: ordinal not in range(128)print s

Note:這里的s是utf-8編碼的,直接使用s.encode(gb2312)實際使用了系統默認defalutencoding(ascii)來解碼,等價于s.decode(defaultencoding).encode(gb2312),而s的實際編碼與defaultencoding不同。

3、UnicodeEncodeError

錯誤的使用decode和encode方法會出現這種異常,比如:使用decode方法將Unicode字符串轉化的時候。比如下面s是unicode(所以不需要再decode,而是應該encode成utf-8)。

#!/usr/bin/python

# -*- coding: utf-8 -*-

s = u’中文’

s.decode(‘utf-8’)

#UnicodeEncodeError: ascii codec cant encode characters in position 0-1: ordinal not in range(128)print s

print輸出異常

有一種情況還是會出現編碼異常,就是使用print()時:

print(測試)

UnicodeEncodeError: ‘ascii’ codec can’t encode character ‘\uff1a’ in position **: ordinal not in range(128)

出現這個錯誤的原因是因為print系統有它自己的編碼,在一般python(2/3)環境中,輸出時會將Unicode轉化為utf-8,但是也可能是轉化為ascii,這時如果unidoce中有中文就會出錯。如果直接輸出unicode字符串,編譯器會自動encode輸出為默認編碼,但是如果是字符串列表是什么就輸出什么不會處理編碼,所以unicode最好還是自定義encode之后再輸出。

還有一種是,如果encode(‘gbk’),但是文件頭# -*- coding:utf-8 -*-輸出也會亂碼。輸出時不能使用print(pattern.encode(‘utf-8’), group.encode(‘utf-8’)),而應該分開print,否則還是亂碼但是不報錯。

標準輸出的定義如下: sys.stdout = codecs.getwriter(“utf-8”)(sys.stdout.detach())

查看輸出編碼:

print(sys.stdout) #或者sys.stdout.encoding
<_io.TextIOWrapper name='<stdout>' encoding='ANSI_X3.4-1968'>竟然不是utf-8!

解決:

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
#或者 sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())
print(sys.stdout)
<_io.TextIOWrapper name='<stdout>' encoding='utf-8'>

或者運行python的時候加上PYTHONIOENCODING=utf-8,即PYTHONIOENCODING=utf-8 python your_script.py

這時就能正確輸出中文了。

python2輸出示例

# -*- coding:utf-8 -*-
s = "人生苦短"  # su是一個utf-8格式的字節串
u = s.decode("utf-8")  # s被解碼為unicode對象,賦給u
sg = u.encode("utf-8")  # u被編碼為gbk格式的字節串,賦給sg
print u
print sg

輸出都是

人生苦短
人生苦短

python3輸出示例

>>>ss=‘北京市’
>>>type(ss)
<class‘str’>
>>>us=ss.encode(‘gbk’)
>>>type(us)
<class‘bytes’>
>>>us
b’\xb1\xb1\xbe\xa9\xca\xd0′
>>>utfs=ss.encode(‘utf-8’)
>>>print(utfs)
b’\xe5\x8c\x97\xe4\xba\xac\xe5\xb8\x82′
>>>type(utfs)
<class‘bytes’>
>>>xx=utfs.decode(‘utf-8’)
>>>type(xx)
<class‘str’>
>>>print(xx)
北京市

encode后的bytes直接輸出是這種形式b’\xe5\x8c\x97\xe4\xba\xac\xe5\xb8\x82′ ,需要decode成python3的str才可見中文。

更復雜示例

1 s = "人生苦短"
2 s.encode('gbk')

看!str也能編碼,(事實上unicode對象也能解碼,但是意義不大)

Note:原理,當對str進行編碼時,會先用默認編碼將自己解碼為unicode,然后在將unicode編碼為你指定編碼。

這就引出了python2.x中在處理中文時,大多數出現錯誤的原因所在:python的默認編碼,defaultencoding是ascii

看這個例子

1 # -*- coding: utf-8 -*-
2 s = "人生苦短"
3 s.encode('gbk')

上面的代碼會報錯,錯誤信息:UnicodeDecodeError: 'ascii' codec can't decode byte ......

因為你沒有指定defaultencoding,所以它其實在做這樣的事情:

1 # -*- coding: utf-8 -*-
2 s = "人生苦短"
3 s.decode('ascii').encode('gbk')

python讀取文件編碼錯誤出現亂碼

首先用notepad++等文本查看器查看讀取文件的編碼,如文件編碼為utf-8則使用utf-8編碼方式打開{其它格式還有gbk, gb2312,ansi等等}

file = open(filename, encoding='UTF-8')

基本沒有編碼錯誤,還是出現某幾個字符錯誤也可以用‘ignore’忽略掉

file = open(filename, encoding='UTF-8', errors='ignore')

[java中文亂碼解決之道]

python讀取文件BOM字符處理

在windows上使用open打開utf-8編碼的txt文件時開頭會有一個多余的字符\ufeff,它叫BOM,是用來聲明編碼等信息的,但python會把它當作文本解析。

對UTF-16, Python將BOM解碼為空字串。然而對UTF-8, BOM被解碼為一個字符\ufeff。

如何去掉bom字符?

解決修改encoding為utf-8_sig或者utf_8_sig

open(‘1.txt’, encoding=’utf_8_sig’ )

[python 的字符編碼和中文處理]

[帶 BOM 的 UTF-8」和「無 BOM 的 UTF-8」有什么區別?網頁代碼一般使用哪個?]

from:http://blog.csdn.net/pipisorry/article/details/44136297

ref: python中的str與unicode處理方法

http://mp.weixin.qq.com/s?__biz=MjM5NzU0MzU0Nw==&mid=204655326&idx=1&sn=cbe436b2ecf1bb7f4f11992756d407c7&from=singlemessage&isappinstalled=0#rd

總結

以上是生活随笔為你收集整理的python字符串编码及乱码解决方案(Python.org)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。