搜尋
首頁後端開發Python教學python 中文亂碼問題深入分析

在本文中,以'哈'來解釋作示例解釋所有的問題,「哈」的各種編碼如下: 
1. UNICODE (UTF8-16),C854; 
2. UTF-8,E59388; 
3. GBK,B9FE。 
一、python中的str和unicode 
一直以來,python中的中文編碼就是一個極為頭大的問題,經常拋出編碼轉換的異常,python中的str和unicode到底是一個什麼東西呢?
在python中提到unicode,一般指的是unicode對象,例如'哈哈'的unicode對象為 
u'u54c8u54c8' 
而str,是一個位元組數組,這個位元組數組表示的是對unicode對象編碼(而str,是一個位元組數組,這個位元組數組表示的是對unicode對象編碼(而str可以是utf-8、gbk、cp936、GB2312)後的儲存的格式。這裡它只是一個位元組流,沒有其它的意義,如果你想讓這個位元組流顯示的內容有意義,就必須用正確的編碼格式,解碼顯示。
例如:

python 中文乱码问题深入分析

對於unicode物件哈哈進行編碼,編碼成一個utf-8編碼的str-s_utf8,s_utf8就是是一個位元組數組,存放的就是'xe5x93x88xe5x93x88',但是這組數組只是一個位元組,如果你想將它透過print語句輸出成哈哈,那你就失望了,為什麼呢?

因為print語句它的實現是將要輸出的內容傳送了操作系統,操作系統會根據系統的編碼對輸入的字節流進行編碼,這就解釋了為什麼utf-8格式的字符串“哈哈”,輸出的是“鍝堯”,因為'xe5x93x88xe5x93x88'用GB2312去解釋,其顯示的出來就是“鍝堯”。這裡再強調一下,str記錄的是位元組數組,只是某種編碼的儲存格式,至於輸出到檔案或列印出來是什麼格式,完全取決於其解碼的編碼將它解碼成什麼樣子。

這裡再對print進行一點補充說明:當將一個unicode物件傳給print時,在內部會將該unicode物件進行一次轉換,轉換成本地的預設編碼(這僅是個人猜測)

二、str和unicode物件的轉換

str和unicode物件的轉換,透過encode和decode實現,具體使用如下:

python 中文乱码问题深入分析

將GBK'哈哈'轉換成unicode,然後再轉換成UTF8

三、Setdefaultencoc%

python 中文乱码问题深入分析如上圖的示範程式碼所示:


當把s(gbk字串)直接編碼成utf-8的時候,將拋出異常,但是透過呼叫如下碼:

import sys

reload( sys)

sys.setdefaultencoding('gbk')

後就可以轉換成功,為什麼呢?在python中str和unicode在編碼和解碼過程中,如果將一個str直接編碼成另一種編碼,會先把str解碼成unicode,採用的編碼為預設編碼,一般預設編碼是anscii,所以在上面範例程式碼中第一次轉換的時候會出錯,當設定目前預設編碼為'gbk'後,就不會出錯了。

至於reload(sys)是因為Python2.5 初始化後會刪除 sys.setdefaultencoding 這個方法,我們需要重新載入。

四、操作不同檔案的編碼格式的檔案

建立一個檔案test.txt,檔案格式用ANSI,內容為:


abc中文

用python來讀取

# open("Test.txt").read()

結果:abc中文

把檔案格式改成UTF-8:

結果:abc涓枃

顯然,這裡要解碼:

# co

gbk

import codecs

print open("Test.txt").read().decode("utf-8")

結果:abc中文

上面的test.txt我是用Editplus來編輯的,Editplus來編輯的,Editplus來編輯的,Editplus來編輯的,Editplus來編輯的,但當我用Windows自備的記事本編輯並存成UTF-8格式時,

運行時錯誤:

Traceback (most recent call last):

File "ChineseTest.py", line 3, in 

File "ChineseTest.py", line 3, in 

File "ChineseTest.py", line 3, in 

File "ChineseTest.py", line 3, in 🎜🎜File "ChineseTest.py", line 3, in 🎜🎜File "ChineseTest.py", line 3, in 🎜🎜File print open("Test.txt").read().decode("utf-8")🎜

UnicodeEncodeError: 'gbk' codec can't encode character u'ufeff' in position 0: illegal multibyte sequence

原來,某些軟體,如notepad,在儲存以UTF-8的地方插入三個不可見的字元(0xEF 0xBB 0xBF,即BOM)。

因此我們在讀取時需要自己去掉這些字符,python中的codecs module定義了這個常數:

# coding=gbk

import codecs

data = open("T..

if data[:3] == codecs.BOM_UTF8:

data = data[3:]

print data.decode("utf-8")

和編碼聲明的作用

原始檔的編碼格式對字串的聲明有什麼作用呢?這個問題困擾一直困擾了我好久,現在終於有點眉目了,文件的編碼格式決定了在該源文件中聲明的字符串的編碼格式,例如:

str = '哈哈'

print repr(str)

a.如果檔案格式為utf-8,則str的值為:'xe5x93x88xe5x93x88'(哈哈的utf-8編碼)

b.如果檔案格式為gbk,則str的值為:'xb9xfexbxfe'哈哈的gbk編碼)

在第一節已經說過,python中的字串,只是一個字節數組,所以當把a情況的str輸出到gbk編碼的控制台時,就將顯示為亂碼:鍝夾搱;而當把b情況下的str輸出utf-8編碼的控制台時,也會顯示亂碼的問題,是什麼也沒有,也許'xb9xfexb9xfe'用utf-8解碼顯示,就是空白吧。 >_說完文件格式,現在來談談編碼聲明的作用吧,每個文件在最上面的地方,都會用# coding=gbk 類似的語句聲明一下編碼,但是這個聲明到底有什麼用呢?到止前為止,我覺得它的作用也就是三個:

聲明源文件中將出現非ascii編碼,通常也就是中文;

在高級的IDE中,IDE會將你的文件格式保存成你指定編碼格式。

決定源碼中類似u'哈'這類聲明的將'哈'解碼成unicode所用的編碼格式,也是一個比較容易讓人迷惑的地方,看例子:

#coding:gbk


#coding:gbk


#coding:gbk

#coding:gbk

#coding:gbk

ss = u'哈哈'

print repr(ss)

print 'ss:%s' % ss

將這個些代碼保存成一個utf-8文本,運行,你認為什麼會輸出呢?大家第一個感覺肯定輸出的肯定是:

u'u54c8u54c8'

ss:哈哈

但其實輸出是:

u'u935du581du6431'ss ,就是編碼聲明在作怪了,在運行ss = u'哈哈'的時候,整個過程可以分為以下幾步:

1) 獲取'哈哈'的編碼:由文件編碼格式確定,為'xe5x93x88xe5x93x88'(哈哈的utf-8編碼形式)

2) 轉成unicode編碼的時候,在這個轉換的過程中,對於'xe5x93x88xe5x93x88'的解碼,不是用utf-8解碼,而是用聲明編碼處指定的編碼GBK ,將'xe5x93x88xe5x93x88'按GBK解碼,得到就是''鍝堝搱'',這三個字的unicode編碼就是u'u935du581du6431',至止可以解釋為什麼print repr(ss)輸出的是u'u9655881du了。

好了,這裡有點繞,我們來分析下一個例子:

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


ss = u'哈哈'

print repr(ss)

printprint

print :%s' % ss


將此範例這次保存成GBK編碼形式,運行結果,竟然是:

🎜UnicodeDecodeError: 'utf8' codec can't decode byte0xb9會有utf8解碼錯誤呢?想想上個範例也明白了,轉換第一步,因為檔案編碼是GBK,得到的是'哈哈'編碼是GBK的編碼'xb9xfexb9xfe',當進行第二步,轉換成unicode的時候,會用UTF8對'xb9xfexb9xfe'進行解碼,而大家查utf-8的編碼表會發現,utf8編碼表(關於UTF- 8解釋可參見字符編碼筆記:ASCII、UTF-8、UNICODE)中根本不存在,所以會報上述錯誤。 🎜🎜🎜🎜🎜更多python 中文亂碼問題深入分析相關文章請關注PHP中文網! 🎜🎜🎜🎜
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
我如何使用美麗的湯來解析HTML?我如何使用美麗的湯來解析HTML?Mar 10, 2025 pm 06:54 PM

本文解釋瞭如何使用美麗的湯庫來解析html。 它詳細介紹了常見方法,例如find(),find_all(),select()和get_text(),以用於數據提取,處理不同的HTML結構和錯誤以及替代方案(SEL)

Python中的數學模塊:統計Python中的數學模塊:統計Mar 09, 2025 am 11:40 AM

Python的statistics模塊提供強大的數據統計分析功能,幫助我們快速理解數據整體特徵,例如生物統計學和商業分析等領域。無需逐個查看數據點,只需查看均值或方差等統計量,即可發現原始數據中可能被忽略的趨勢和特徵,並更輕鬆、有效地比較大型數據集。 本教程將介紹如何計算平均值和衡量數據集的離散程度。除非另有說明,本模塊中的所有函數都支持使用mean()函數計算平均值,而非簡單的求和平均。 也可使用浮點數。 import random import statistics from fracti

python對象的序列化和避難所化:第1部分python對象的序列化和避難所化:第1部分Mar 08, 2025 am 09:39 AM

Python 對象的序列化和反序列化是任何非平凡程序的關鍵方面。如果您將某些內容保存到 Python 文件中,如果您讀取配置文件,或者如果您響應 HTTP 請求,您都會進行對象序列化和反序列化。 從某種意義上說,序列化和反序列化是世界上最無聊的事情。誰會在乎所有這些格式和協議?您想持久化或流式傳輸一些 Python 對象,並在以後完整地取回它們。 這是一種在概念層面上看待世界的好方法。但是,在實際層面上,您選擇的序列化方案、格式或協議可能會決定程序運行的速度、安全性、維護狀態的自由度以及與其他系

如何使用TensorFlow或Pytorch進行深度學習?如何使用TensorFlow或Pytorch進行深度學習?Mar 10, 2025 pm 06:52 PM

本文比較了Tensorflow和Pytorch的深度學習。 它詳細介紹了所涉及的步驟:數據準備,模型構建,培訓,評估和部署。 框架之間的關鍵差異,特別是關於計算刻度的

哪些流行的Python庫及其用途?哪些流行的Python庫及其用途?Mar 21, 2025 pm 06:46 PM

本文討論了諸如Numpy,Pandas,Matplotlib,Scikit-Learn,Tensorflow,Tensorflow,Django,Blask和請求等流行的Python庫,並詳細介紹了它們在科學計算,數據分析,可視化,機器學習,網絡開發和H中的用途

用美麗的湯在Python中刮擦網頁:搜索和DOM修改用美麗的湯在Python中刮擦網頁:搜索和DOM修改Mar 08, 2025 am 10:36 AM

該教程建立在先前對美麗湯的介紹基礎上,重點是簡單的樹導航之外的DOM操縱。 我們將探索有效的搜索方法和技術,以修改HTML結構。 一種常見的DOM搜索方法是EX

如何使用Python創建命令行接口(CLI)?如何使用Python創建命令行接口(CLI)?Mar 10, 2025 pm 06:48 PM

本文指導Python開發人員構建命令行界面(CLIS)。 它使用Typer,Click和ArgParse等庫詳細介紹,強調輸入/輸出處理,並促進用戶友好的設計模式,以提高CLI可用性。

解釋Python中虛擬環境的目的。解釋Python中虛擬環境的目的。Mar 19, 2025 pm 02:27 PM

文章討論了虛擬環境在Python中的作用,重點是管理項目依賴性並避免衝突。它詳細介紹了他們在改善項目管理和減少依賴問題方面的創建,激活和利益。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具