python编码的理解

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()
posted @ 2011-03-02 17:17 dkcndk 阅读(...) 评论(...) 编辑 收藏