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()
|