最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解python中文編碼問題

 更新時間:2021年06月21日 17:15:59   作者:daivlin  
一直以來python中文編碼是個及其頭大的問題,需要好好學(xué)習(xí)下,我用python為例,簡單介紹下python編程時如何處理好中文編碼的問題,感興趣的朋友們可以參考下

 1.        在Python中使用中文

在Python中有兩種默認(rèn)的字符串:str和unicode。在Python中一定要注意區(qū)分“Unicode字符串”和“unicode對象”的區(qū)別。后面所有的“unicode字符串”指的都是python里的“unicode對象”。

事實上在Python中并沒有“Unicode字符串”這樣的東西,只有“unicode”對象。一個傳統(tǒng)意義上的unicode字符串完全可以用str對象表示。只是這時候它僅僅是一個字節(jié)流,除非解碼為unicode對象,沒有任何實際的意義。

我們用“哈哈”在多個平臺上測試,其中“哈”對應(yīng)的不同編碼是:

1.              UNICODE (UTF8-16),      C854;

2.              UTF-8,                    E59388;

3.              GBK,               B9FE。

1.1     Windows控制臺

下面是在windows控制臺的運行結(jié)果:

 

可以看出在控制臺,中文字符的編碼是GBK而不是UTF-16。將字符串s(GBK編碼)使用decode進(jìn)行解碼后,可以得到同等的unicode對象。

注意:可以在控制臺打印ss并不代表它可以直接被序列化,比如:

 

向文件直接輸出ss會拋出同樣的異常。在處理unicode中文字符串的時候,必須首先對它調(diào)用encode函數(shù),轉(zhuǎn)換成其它編碼輸出。這一點對各個環(huán)境都一樣。

總結(jié):在Python中,“str”對象就是一個字節(jié)數(shù)組,至于里面的內(nèi)容是不是一個合法的字符串,以及這個字符串采用什么編碼(gbk, utf-8, unicode)都不重要。這些內(nèi)容需要用戶自己記錄和判斷。這些的限制也同樣適用于“unicode”對象。要記住“unicode”對象中的內(nèi)容可絕對不一定就是合法的unicode字符串,我們很快就會看到這種情況。

總結(jié):在windows的控制臺上,支持gbk編碼的str對象和unicode編碼的unicode對象。

1.2     Windows IDLE(在Shell上運行)

在windows下的IDLE中,運行效果和windows控制臺不完全一致:

 

可以看出,對于不使用“u”作標(biāo)識的字符串,IDLE把其中的中文字符進(jìn)行GBK編碼。但是對于使用“u”的unicode字符串,IDLE居然一樣是用了GBK編碼,不同的是,這時候每一個字符都是unicode(對象)字符?。〈藭rlen(ss) = 4。

這樣產(chǎn)生了一個神奇的問題,現(xiàn)在的ss無法在IDLE中正常顯示。而且我也沒有辦法把ss轉(zhuǎn)換成正常的編碼!比如采用下面的方法:

 

這有可能是因為IDLE本地化做得不夠好,對中文的支持有問題。建議在IDLE的SHELL中,不要使用u“中文”這種方式,因為這樣得到的并不是你想要的東西。

這同時說明IDLE的Shell支持兩種格式的中文字符串:GBK編碼的“str”對象,和UNICODE編碼的unicode對象。

1.3     在IDLE上運行代碼

在IDLE的SHELL上運行文件,得到的又是不同的結(jié)果。文件的內(nèi)容是:

 

直接運行的結(jié)果是:

 

毫無瑕疵,相當(dāng)令人滿意。我沒有試過其它編碼的文件是否能正常運行,但想來應(yīng)該是不錯的。

同樣的代碼在windows的控制臺試演過,也沒有任何問題。

 1.4     Windows Eclipse

在Eclipse中處理中文更加困難,因為在Eclipse中,編寫代碼和運行代碼屬于不同的窗口,而且他們可以有不同的默認(rèn)編碼。對于如下代碼:

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
s = "哈哈"
ss = u'哈哈'
 
print repr(s)
print repr(ss)
 
print s.decode('utf-8').encode('gbk')
print ss.encode('gbk')
 
print s.decode('utf-8')
print ss

前四個print運行正常,最后兩個print都會拋出異常:
'/xe5/x93/x88/xe5/x93/x88'
u'/u54c8/u54c8'
哈哈
哈哈
Traceback (most recent call last):
 File "E:/Workspace/Eclipse/TestPython/Test/test_encoding_2.py", line 13, in <module>
    print s.decode('utf-8')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

也就是說,GBK編碼的str對象可以正常打印,但是不能打印UNICODE編碼的unicode對象。在源文件上點擊“Run as”“Run”,然后在彈出對話框中選擇“Common”:

 

可以看出Eclipse控制臺的缺省編碼方式是GBK;所以不支持UNICODE也在情理之中。如果把文件中的coding修改成GBK,則可以直接打印GBK編碼的str對象,比如s。

如果把源文件的編碼設(shè)置成“UTF-8”,把控制臺的編碼也設(shè)置成“UTF-8”,按道理說打印的時候應(yīng)該沒有問題。但是實驗表明,在打印UTF-8編碼的str對象時,中文的最后一個字符會顯示成亂碼,無法正常閱讀。不過我已經(jīng)很滿足了,至少人家沒有拋異常不是:)

BTW: 使用的Eclipse版本是3.2.1。

1.5     從文件讀取中文

在window下面用記事本編輯文件的時候,如果保存為UNICODE或UTF-8,分別會在文件的開頭加上兩個字節(jié) “/xFF/xFE” 和三個字節(jié)“/xEF/xBB/xBF”。在讀取的時候就可能會遇到問題,但是不同的環(huán)境對這幾個多于字符的處理也不一樣。

以windows下的控制臺為例,用記事本保存三個不同版本的“哈哈”。  

打開utf-8格式的文件并讀取utf-8字符串后,解碼變成unicode對象。但是會把附加的三個字符同樣進(jìn)行轉(zhuǎn)換,變成一個unicode字符,字符的數(shù)據(jù)值為“/xFF/xFE”。這個字符不能被打印。編碼的時候需要跳過這個字符。

 

打開unicode格式的文件后,得到的字符串正確。這時候適用utf-16解碼,能得到正確的unicdoe對象,可以直接使用。多余的那個填充字符在進(jìn)行轉(zhuǎn)換時會被過濾掉。  

 

打開ansi格式的文件后,沒有填充字符,可以直接使用。
結(jié)論:讀寫使用python生成的文件沒有任何問題,但是在處理由notepad生成的文本文件時,如果該文件可能是非ansi編碼,需要考慮如何處理填充字符。

1.6     在數(shù)據(jù)庫中使用中文

剛剛接觸Python,我用的數(shù)據(jù)庫是mysql。在執(zhí)行插入、查找等操作時,如果運行環(huán)境使用的字符編碼和mysql不一致,就可能導(dǎo)致運行時的錯誤。當(dāng)然,和上面看到的情況一樣,運行環(huán)境并不是關(guān)鍵因素,關(guān)鍵是查詢語句的編碼方式。如果在每次執(zhí)行查詢操作時都把查詢字符串做一次編碼轉(zhuǎn)換,轉(zhuǎn)變成mysql的默認(rèn)字符編碼,一樣不會遇到問題。但是這樣寫代碼也太痛苦了吧。

使用如下代碼連接數(shù)據(jù)庫:

self.conn = MySQLdb.connect(use_unicode = 1, charset='utf8', **server)

我不能理解的是既然數(shù)據(jù)庫用的默認(rèn)編碼是UTF-8,我連接的時候也用的是UTF-8,為什么查詢得到的文本內(nèi)容卻是UNICODE編碼(unicode對象)?這是MySQLdb庫的設(shè)置么?

1.7     在XML中使用中文

使用xml.dom.minidom和MySQLdb類似,對生成的dom對象調(diào)用toxml方法得到的是unicode對象。如果希望輸出utf-8文本,有兩種方法:

1.使用系統(tǒng)函數(shù)
在輸出xml文檔的時候進(jìn)行編碼,這是我覺得最好的方法。

xmldoc.toxml(encoding='utf-8')
xmldoc.writexml(outfile, encoding = ‘utf-8')

2.自己編碼生成

在使用toxml之后可以調(diào)用encode方法對文檔進(jìn)行編碼。但這種方法無法得到合適的xml declaration(xml文檔第一行中的encoding部分)。
不要嘗試通過xmldoc.createProcessingInstruction來創(chuàng)建一個processing instraction:

<?xml version='1.0' encoding='utf-8'?>

xml declaration雖然看起來像是,但是事實上并不是一個processing instraction。可以通下面的方法得到一個滿意的xml文件:

print >> outfile, “<?xml version='1.0' encoding='utf-8'?>”
print >> outfile, xmldoc.toxml().encode(‘utf-8')[22:]

其中第二行需要過濾掉在調(diào)用xmldoc.toxml時生成的“<?xml version='1.0' ?>”,它的長度是22。

相面是兩種方法的用法比較:

 

另外,在IDLE的shell中,不要用 u'中文' 對屬性進(jìn)行賦值。上面討論過,這樣得到的unicode字符串不正確。

到此這篇關(guān)于python中文編碼問題的文章就介紹到這了,更多相關(guān)中文編碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何在Python中用好短路機(jī)制

    如何在Python中用好短路機(jī)制

    這篇文章主要介紹了如何在Python中用好短路機(jī)制,Python中的短路機(jī)制非常有用,跟很多其他編程語言中的短路機(jī)制作用類似,接下來讓我們通過幾個簡單的例子總結(jié)Python中可用的幾種短路機(jī)制,需要的朋友可以參考下
    2022-02-02
  • 使用Python和Selenium構(gòu)建一個自動化圖像引擎

    使用Python和Selenium構(gòu)建一個自動化圖像引擎

    這篇文章主要為大家詳細(xì)介紹了如何使用Python和Selenium庫構(gòu)建一個自動化圖像引擎,能夠根據(jù)指定參數(shù)自動截取網(wǎng)頁快照,并將生成的圖片存儲到云端,需要的可以參考下
    2024-12-12
  • NumPy中np.c_ 和 np.r_ 的區(qū)別小結(jié)

    NumPy中np.c_ 和 np.r_ 的區(qū)別小結(jié)

    np.c_和?np.r_是NumPy庫中兩個非常有用的函數(shù),它們分別用于按列和按行拼接數(shù)組本文主要介紹了NumPy中np.c_ 和 np.r_ 的區(qū)別小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • Python中關(guān)于列表的常規(guī)操作范例以及介紹

    Python中關(guān)于列表的常規(guī)操作范例以及介紹

    列表是一種有序的集合,可以隨時添加和刪除其中的元素。在python中使用的頻率非常高,本篇文章對大家的學(xué)習(xí)或工作具有一定的價值,需要的朋友可以參考下
    2021-09-09
  • pycharm 2020 1.1的安裝流程

    pycharm 2020 1.1的安裝流程

    這篇文章主要介紹了pycharm 2020 1.1的安裝流程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • 如何基于windows實現(xiàn)python定時爬蟲

    如何基于windows實現(xiàn)python定時爬蟲

    這篇文章主要介紹了如何基于windows實現(xiàn)python定時爬蟲,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • OpenCV半小時掌握基本操作之高斯雙邊

    OpenCV半小時掌握基本操作之高斯雙邊

    這篇文章主要介紹了OpenCV基本操作之高斯雙邊,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • python輸入多行字符串的方法總結(jié)

    python輸入多行字符串的方法總結(jié)

    在本篇文章里小編給大家分享的是關(guān)于python輸入多行字符串的方法以及實例代碼,需要的朋友們可以學(xué)習(xí)下。
    2019-07-07
  • Django卸載之后重新安裝的方法

    Django卸載之后重新安裝的方法

    如果你打算從過去的一個版本升級Django, 你需要先刪除老版本的Django之后,再安裝新的版本。下面這篇文章主要給大家介紹了在Django卸載之后重新安裝的方法,文中給出了詳細(xì)的步驟,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • 詳解Python的基礎(chǔ)語法和變量操作

    詳解Python的基礎(chǔ)語法和變量操作

    這篇文章主要詳細(xì)介紹了Python的基礎(chǔ)語法和變量操作,對剛剛學(xué)習(xí)python的小伙伴非常友好,對我們的學(xué)習(xí)有一定的幫助,需要的朋友可以參考下
    2023-06-06

最新評論

宁阳县| 古交市| 邵武市| 湖口县| 江孜县| 青阳县| 荣昌县| 广灵县| 玛纳斯县| 萝北县| 盐边县| 靖安县| 安宁市| 双流县| 兴安县| 安福县| 法库县| 扶绥县| 江永县| 南涧| 越西县| 南康市| 玉林市| 隆林| 封丘县| 饶阳县| 平邑县| 宁城县| 益阳市| 石嘴山市| 嘉荫县| 株洲县| 府谷县| 繁昌县| 新安县| 巫山县| 松潘县| 景宁| 游戏| 萝北县| 苏尼特左旗|