Python的中文編碼問題

2021-08-04 06:34:40 字數 2139 閱讀 9036

基本編碼

(1)當沒有給定任何編碼提示的時候,python預設使用ascii作為它的標準編碼格式。所以對於中文這樣的非asciii編碼的字元,不指定編碼格式時就會報錯。

(2)python裡面string型別和unicode型別是兩種不同的型別,string型別的編碼格式就是原始碼的編碼格式,而unicode型別就是unicode編碼的。

(3)在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字串解碼(使用decode方法,引數是資料自身的編碼)成unicode,再從unicode編碼(encode方法,引數是需要使用的編碼格式)成另一種編碼。

(4)字串使用decode正確解碼後,字串就會變成了unicode型別的了。

常見的編碼異常

(1)syntaxerror:non-ascii character。說的是python原始碼檔案中在沒有宣告原始碼編碼格式的情況下含有非ascii字元。因為原始碼預設ascii編碼格式,當含有中文這樣的不能被ascii格式編碼的字元時,就會有這樣的錯誤,所以要指定能夠編碼中文的的編碼格式。

(2)unicodedecodeerror:這個異常的出現有兩種情況:①使用decode方法解碼的時候。因為使用decode方法解碼時,引數必須是呼叫decode方法的字串自身的編碼格式,若不是,就會有這樣的異常出現;②當沒有轉換成unicode編碼格式時就使用encode方法編碼的話,也會彈出這個異常,因為編譯器會嘗試自己先解碼,由於不知道解碼格式,所以必然會有這樣的錯誤。

(3)unicodeencodeerror:當使用decode方法將unicode字串進行轉換的時候,就會報這個異常。因為unicode字串本身已經是可轉換狀態了,不能再解碼了,只能編碼,所以編譯器把這樣的錯誤歸結到編碼異常。

解決方法

(1)宣告編碼格式:當原始碼(注釋也要考慮)包含ascii編碼格式不能編碼的字元時,最好先宣告編碼格式。最常見的宣告方法如下:

# _*_ coding: _*_
其中< encoding name >是我們指定的原始碼的編碼格式,可以是任意一種python支援的格式,一般都會使用utf-8格式。

(2)使用u』中文』替代』中文』,如:

str1 = '中文編碼'

str2 = u'中文編碼'

str1的編碼格式是我們所指定的或者是預設的原始碼編碼格式。而str2在前面加個u,表明str2是unicode編碼格式。通常來說str2會比str1好,因為當我們需要將字串轉換成其它編碼格式時,str2不用decode解碼,直接encode編碼就可以了,而str1還要根據自己的編碼格式先解碼,然後再編碼成我們想要的編碼格式。

(3)reset預設編碼:事實上,我們可以設定python的預設編碼格式,通過以下方式:

import sys

sys.setdefaultencoding('utf-8')

這種方法雖然可以解決部分編碼問題,但是同時也引入了很多其它問題,引發問題的本質並沒有改變,不建議使用。

(4)終極原則:decode early,unicode everywhere,encode late。最後分享乙個終極原則:decode early, unicode everywhere, encode late,即:在輸入或者宣告字串的時候,盡早地使用decode方法將字串轉化成unicode編碼格式;然後在程式內使用字串的時候統一使用unicode格式進行處理,比如字串拼接、字串替換、獲取字串的長度等操作;最後,在輸出字串的時候(控制台/網頁/檔案),通過encode方法將字串轉化為你所想要的編碼格式,比如utf-8等

(5)公升級python2.x到python3.x:因為python3.x對字元編碼方面做了很大的改進。①預設編碼格式改為unicode;②所有的python內建模組都支援unicode;③不再支援u』中文』的語法格式等。

(2)pep 0263 — defining python source code encodings

python中文編碼問題

在 python 中對中文進行處理的時候,往往涉及到編碼轉換的問題,通常使用以下三種編碼格式 utf 8 gbkunicode 國內用的比較多的是 gbk格式,unicode 是乙個很好的編碼方案,將世界各國的語言進行了統一的編碼,美國人後來覺得自己吃了大虧,於是又搞了一種變長編碼的 utf 8 的...

python中文編碼問題

為什麼會報錯 unicodeencodeerror ascii codec can t encode characters in position 0 1 ordinal not in range 128 本文就來研究一下這個問題。字串在python內部的表示是unicode 編碼,因此,在做編碼轉...

python中文編碼問題

一道非常簡單的python小題,可要搞死我了 題目 輸入某年某月某日,判斷這一天是這一年的第幾天?這題很簡單,但我想要的是這樣的效果 輸入 1月1 輸出 1 也就是說,需要 原本的 片段 a raw input b 月 c a.index b 就是輸入一行字串,找到 月 在哪,然後切割成兩部分 根據...