python 中文字符的處理


剛開始學習python的時候,都是對這英文的翻譯書學習的。沒有解除到中文編碼的相關問題,直到自己用python去做相關的項目的時候才發先中文編碼問題真的非常頭疼啊。這里分享一下本人所了解的一些經驗。

讀取utf-8個格式存儲的文件

1. 假如現在有一個文件test.txt,里面有內容“python學習”,該文件以utf-8格式存儲。那么讀取並輸出該字符串的方法如下:

filehandle=open("test.txt","r")
## the file is saved as utf-8 without bom
print filehandle.read().decode("utf-8").encode("gbk")
filehandle.close()

上面的代碼decode("utf-8")是把utf-8格式的內容解碼成unicode編碼,然后通過encode("gbk")轉換成GBK格式輸出。

2. 假如test.txt是以utf-8 含有BOM的格式存儲,讀入方式又不一樣,這種格式會在文件最開始的地方插入看不見的字符BOM(即0xEF 0xBB 0xBF),需要用到codecs。(用notepad++可以選擇將文件保存為utf-8,utf-8無BOM等個存儲格式)

filehandle=open("test.txt","r")
## the file is saved as utf-8 with bom
content = filehandle.read()
if content[:3]==codecs.BOM:
    content=content[3:]
print content.decode("utf-8")#.encode("gbk")
filehandle.close()

這邊為什么不需要用到encode("gbk")?很費解

 

讀取ASNI格式存儲的文件

這種就非常簡單了,不需要任何轉換

filehandle=open("test.txt","r")
## the file is saved as ASNI
content = filehandle.read()
print content
filehandle.close()

 

python腳本中包含hardcode的中文

#!/usr/bin/env python
def main():
    s="python學習"
    print s

if __name__ == '__main__':
    main()

python中默認的編碼方式是ASCII(可以通過sys.getdefaultencoding()),上面的test.py文件是以ASCII格式保存的,當調用print的時候會隱式地進行從ASCII到系統默認編碼(Windows上為CP936,可以通過sys.stout.encoding)的轉換,中文字符並不是ASCII,所以需要在test.py文件中進行編碼聲明。需要在開頭加上一句 "# coding=utf-8"即可(最好用文本編輯器或notepad++,不然可能會有意想不到的輸出)

總之,最好避免在腳本源文件中試用hardcode的字符串,尤其是中文字符。

 

普通字符和中文字符進行字符串連接

# coding=utf-8

def main():
    s="python學習"+u"hello"
    print s


if __name__ == '__main__':
    main()

使用+操作符連接字符串的時候,左邊為str類型,右邊為unicode類型。python會見左邊的中文字符串轉換為Unicode后再與右邊的Unicode連接,將str轉換為Unicode的時候試用系統默認的ASCII編碼對字符串進行解碼,所以可能會產生UnicodeDecodeError異常。下面的解決方法:

 
        
s="python學習".decode("gbk")+u"hello" 
或者
s="python學習"+u"hello".encode("utf-8")
 
        

字符串行為與python3一致

最后提一點,從python2.6以后可以通過下面的方式將定義的普通字符串識別為Unicode字符串,這樣字符串的行為將與python3保持一致

from __future__ import unicode_literals

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM