from:http://www.unixresources.net/linux/clf/python/archive/00/00/42/73/427317.html
結合二位的回覆,運行結果如下:
>>> a='中國'
>>> b=unicode(a, 'cp936')
>>> b
u'u4e2du56fd'
>>> c = b.encode('utf-8')
>>> c
'xe4xb8xadxe5x9bxbd'
>>> d = b.encode('cp936')
>>> d
'xd6xd0xb9xfa'
加上unihan的資料庫,得知b包含的實際上是那個decimal值,等同於utf-16編碼,c包含的是utf-8編碼,d包含的就是gb2312編碼了。關於unicode在python內部的表示(即用unicode()函數轉換的結果),就是那個唯一的Decimal值,等同於utf-16。當然,UTF和Unicode並不是同樣的事物,後者是前者的變換格式。我的理解對嗎?
另外,"cp936"能夠用於Linux系統嗎?
還有一個問題請教一下:
python的unicode()函數和字串對象的encode()方法能否介紹一下?主要是它們的作用以及能夠接受的Encoding。
真的是非常感謝了。澄清了一個重要概念。
P.S 《無廢話XML》中有一章專門介紹Unicode。它裡面就把UTF-8, UTF-16, Unicode的關係說得很清楚了。對照這片文章二位的解說,我想大家都會像我一樣,學到不少東西的。
=========================
又試了一下,對於unicode()函數,
主要用到兩個參數:原字串,編碼
比如‘'中'字的utf-8編碼是:xe4xb8xad,
這時,unicode('xe4xb8xad', 'utf-8')的結果就是'中'字的unicode,為:u'u4e2d'.
即參數中的'utf-8'用來指出前面那個串的編碼是什麼。而unicode()的作用就是按照這個編碼來解釋第一個參數,並且返回它的unicode形式。
但是對於u"xxx"的形式還未理解,對於str.encode()也沒有理解……
=============================
你說的內部的unicode編碼是使用utf-16應該是對的。
我一般將一個字串轉為unicode都使用unicode(str, encoding)
而將一個unicode轉為其它的編碼使用unistr.encode(encoding)
u"xxx"是python中用來表示字元的內部編碼的一種表示方法。
在linux下沒有cp936的使用。這一點在我的blog上有說明:http://www.donews.net/limodou/archive/2004/08/13/67432.aspx
因此要使用要不自已搞一個gbk的編碼模組,要不使用cjk模組。
================================
Code:
#coding:utf-8 #指定本檔案編碼為utf8 import os # 以下為範例程式碼,不一定能運行。隨意寫的,無編譯運行過。 # 例子以XP平台為例,因為linux平台編碼(UTF-8)與window平台(GBK)不一樣。 # 假設D盤下面有很多中文名稱檔案 filelist = os.listdir(r"d:\") # 此處返回的list中的中文是以GBK編碼的,你可以通過查看cmd視窗屬性看到。 for path in filelist: if os.path.isdir(path): continue fp = open(path.decode("GBK") , 'rb') # 如果此處用 path.decode("UTF-8") 就會拋異常,原因是wind的dir命令返回的是GBK編碼 print len(fp.read()) fp.close() filepath =r"d:\中文檔案.doc" # 假設此文存在,記得要帶中文 fp = open(filepath.decode('utf-8'), "rb") #這裡使用utf8參數進行解碼,原因是檔案頭裡有句coding: utf-8 print len(fp.read()) fp.close() path2 = u"d:\中文檔案.doc" # 假如這裡有個u在前面,這個變數就是unicode編碼了,不用解碼。 fp = open(path2, 'rb') print len(fp.read()) fp.close() |