欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在Python中關(guān)于中文編碼問(wèn)題的處理建議

 更新時(shí)間:2015年04月08日 09:15:28   投稿:goldensun  
這篇文章主要介紹了幾種在Python中關(guān)于中文編碼問(wèn)題的處理方法,包括在使用Unicode編碼時(shí)碰到的異常等,需要的朋友可以參考下

字符串是Python中最常用的數(shù)據(jù)類(lèi)型,而且很多時(shí)候你會(huì)用到一些不屬于標(biāo)準(zhǔn)ASCII字符集的字符,這時(shí)候代碼就很可能拋出UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 10: ordinal not in range(128)異常。這種異常在Python中很容易遇到,尤其是在Python2.x中,是一個(gè)很讓初學(xué)者費(fèi)解頭疼的問(wèn)題。不過(guò),如果你理解了Python的Unicode,并在編碼中遵循一定的原則,這種編碼問(wèn)題還是比較容易理解和解決的。

字符串在Python內(nèi)部的表示是unicode編碼,因此,在做編碼轉(zhuǎn)換時(shí),通常需要以u(píng)nicode作為中間編碼,即先將其他編碼的字符串解碼(decode)成unicode,再?gòu)膗nicode編碼(encode)成另一種編碼。但是,Python 2.x的默認(rèn)編碼格式是ASCII,就是說(shuō),在沒(méi)有指定Python源碼編碼格式的情況下,源碼中的所有字符都會(huì)被默認(rèn)為ASCII碼。也因?yàn)檫@個(gè)根本原因,在Python 2.x中經(jīng)常會(huì)遇到UnicodeDecodeError或者UnicodeEncodeError的異常。

關(guān)于Unicode

Unicode是一種字符集,它為每一種現(xiàn)代或古代使用的文字系統(tǒng)中出現(xiàn)的每一個(gè)字符都提供了統(tǒng)一的序列號(hào),規(guī)定了符號(hào)的二進(jìn)制代碼,但沒(méi)有規(guī)定這個(gè)二進(jìn)制代碼應(yīng)該如何存儲(chǔ)。也就是說(shuō):Unicode的編碼方式是固定的,但是實(shí)現(xiàn)方式根據(jù)不同的需要有跟多種,常見(jiàn)的有UTF-8、UTF-16和UTF-32等。更多的介紹大家可以參看維基百科:Unicode

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

常見(jiàn)的幾種編碼異常

Python中常見(jiàn)的幾種編碼異常有SyntaxError: Non-ASCII character、UnicodeDecodeError和UnicodeEncodeError等。下面依次舉例說(shuō)明一下:

1、SyntaxError: Non-ASCII character

這種異常最不容易出現(xiàn),也最容易處理,主要原因是Python源碼文件中有非ASCII字符,而且同時(shí)沒(méi)有聲明源碼編碼格式,例如:
 

s = '中文'
print s   # 拋出異常

2、UnicodeDecodeError

這個(gè)異常有時(shí)候會(huì)在調(diào)用decode方法時(shí)出現(xiàn),原因是Python打算將其他編碼的字符轉(zhuǎn)化為Unicode編碼,但是字符本身的編碼格式和decode方法傳入的編碼格式不一致,例如:
 

#!/usr/bin/python
# -*- coding: utf-8 -*-
s = '中文'
s.decode('gb2312') # UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 2-3: illegal multibyte sequence
print s

上面這段代碼中字符串s的編碼格式是utf-8,但是在使用decode方法轉(zhuǎn)化為Unicode編碼時(shí)傳入的參數(shù)是‘gb2312',因此在轉(zhuǎn)化的時(shí)候拋出UnicodeDecodeError異常。還有一種情況是在encode的時(shí)候:
 

#!/usr/bin/python
# -*- coding: utf-8 -*-
s = '中文'
s.encode('gb2312') # UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
print s

3、UnicodeEncodeError

錯(cuò)誤的使用decode和encode方法會(huì)出現(xiàn)這種異常,比如:使用decode方法將Unicode字符串轉(zhuǎn)化的時(shí)候:
 

#!/usr/bin/python
# -*- coding: utf-8 -*-
s = u'中文'
s.decode('utf-8') # UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
print s

當(dāng)然,除了上面列出的幾種出現(xiàn)異常的情況之外還有很多可能出現(xiàn)異常的例子,這里就不在一一說(shuō)明了。

解決方法

對(duì)于以上的幾個(gè)異常,有以下幾個(gè)處理的方法和原則。

1、遵循PEP0263原則,聲明編碼格式

在PEP 0263 -- Defining Python Source Code Encodings中提出了對(duì)Python編碼問(wèn)題的最基本的解決方法:在Python源碼文件中聲明編碼格式,最常見(jiàn)的聲明方式如下:

#!/usr/bin/python
# -*- coding: <encoding name> -*-

其中<encoding name>是代碼所需要的編碼格式,它可以是任意一種Python支持的格式,一般都會(huì)使用utf-8的編碼格式。

2、使用u'中文'替代'中文'
 

str1 = '中文編碼'
str2 = u'中文編碼'

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

3、Reset默認(rèn)編碼

Python中出現(xiàn)這么多編碼問(wèn)題的根本原因是Python 2.x的默認(rèn)編碼格式是ASCII,所以你也可以通過(guò)以下的方式修改默認(rèn)的編碼格式:
 

import sys
sys.setdefaultencoding('utf-8')

這種方法是可以解決部分編碼問(wèn)題,但是同時(shí)也會(huì)引入很多其他問(wèn)題,得不償失,不建議使用這種方式。

4、終極原則:decode early, unicode everywhere, encode late

最后分享一個(gè)終極原則:decode early, unicode everywhere, encode late,即:在輸入或者聲明字符串的時(shí)候,盡早地使用decode方法將字符串轉(zhuǎn)化成unicode編碼格式;然后在程序內(nèi)使用字符串的時(shí)候統(tǒng)一使用unicode格式進(jìn)行處理,比如字符串拼接、字符串替換、獲取字符串的長(zhǎng)度等操作;最后,在輸出字符串的時(shí)候(控制臺(tái)/網(wǎng)頁(yè)/文件),通過(guò)encode方法將字符串轉(zhuǎn)化為你所想要的編碼格式,比如utf-8等。

按照這個(gè)原則處理Python的字符串,基本上可以解決所有的編碼問(wèn)題(只要你的代碼和Python環(huán)境沒(méi)有問(wèn)題)。。。

5、升級(jí)Python 2.x到3.x

額,最后一個(gè)方法,升級(jí)Python 2.x,使用Python 3.x版本。。這樣說(shuō)主要是為了吐槽Python 2.x的編碼設(shè)計(jì)問(wèn)題。當(dāng)然,升級(jí)到Python 3.x肯定可以解決大部分因?yàn)榫幋a產(chǎn)生的異常問(wèn)題。畢竟Python 3.x版本對(duì)字符串這部分還是做了相當(dāng)大的改進(jìn)的,具體的下面會(huì)說(shuō)。。。。

Python 3.x中的Unicode

在Python 3.0之后的版本中,所有的字符串都是使用Unicode編碼的字符串序列,同時(shí)還有以下幾個(gè)改進(jìn):

1、默認(rèn)編碼格式改為unicode

2、所有的Python內(nèi)置模塊都支持unicode

3、不再支持u'中文'的語(yǔ)法格式

所以,對(duì)于Python 3.x來(lái)說(shuō),編碼問(wèn)題已經(jīng)不再是個(gè)大的問(wèn)題,基本上很少遇到上述的幾個(gè)異常。關(guān)于Python 2.x str&unicode和Python 3.x str&bytes的更多說(shuō)明和對(duì)比,大家可以看一下:Python中字符編碼的總結(jié)和對(duì)比

相關(guān)文章

  • python+opencv輪廓檢測(cè)代碼解析

    python+opencv輪廓檢測(cè)代碼解析

    這篇文章主要介紹了python+opencv輪廓檢測(cè)代碼解析,本文實(shí)例實(shí)現(xiàn)對(duì)圖片的簡(jiǎn)單處理,比如圖片的讀取,灰度顯示等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 5個(gè)Python中實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音模塊的使用講解

    5個(gè)Python中實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音模塊的使用講解

    這篇文章主要為大家詳細(xì)介紹了5個(gè)Python中實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音模塊的使用,文中的示例代碼講解詳細(xì),對(duì)我們深入掌握Python有一定的幫助,需要的可以參考下
    2023-11-11
  • python粘包的解決方案

    python粘包的解決方案

    粘包就是在數(shù)據(jù)傳輸過(guò)程中有多個(gè)數(shù)據(jù)包被粘連在一起被發(fā)送或接受,本文主要介紹了python粘包的解決方案,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • python 爬蟲(chóng) 批量獲取代理ip的實(shí)例代碼

    python 爬蟲(chóng) 批量獲取代理ip的實(shí)例代碼

    今天小編就為大家分享一篇python 爬蟲(chóng) 批量獲取代理ip的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Python計(jì)算回文數(shù)的方法

    Python計(jì)算回文數(shù)的方法

    這篇文章主要介紹了Python計(jì)算回文數(shù)的方法,實(shí)例分析了Python操作字符串的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • 基于python編寫(xiě)一個(gè)車(chē)型識(shí)別小程序

    基于python編寫(xiě)一個(gè)車(chē)型識(shí)別小程序

    基于Python制作一個(gè)車(chē)型識(shí)別小程序,可用于拍照識(shí)車(chē),根據(jù)拍攝照片,快速識(shí)別圖片中車(chē)輛的品牌型號(hào),文章通過(guò)代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-10-10
  • Python如何快速生成本項(xiàng)目的requeirments.txt實(shí)現(xiàn)

    Python如何快速生成本項(xiàng)目的requeirments.txt實(shí)現(xiàn)

    本文主要介紹了Python如何快速生成本項(xiàng)目的requeirments.txt實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • centos 下面安裝python2.7 +pip +mysqld

    centos 下面安裝python2.7 +pip +mysqld

    這篇文章主要介紹了centos 下面安裝python2.7 +pip +mysqld,需要的朋友可以參考下
    2014-11-11
  • python實(shí)現(xiàn)猜拳游戲項(xiàng)目

    python實(shí)現(xiàn)猜拳游戲項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)猜拳游戲項(xiàng)目,以excel形式保存信息,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Selenium中的option使用示例

    Selenium中的option使用示例

    這篇文章主要介紹了Selenium中的option用法實(shí)例,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12

最新評(píng)論