您的位置:首页 > 编程语言 > Python开发

python中的中文编码问题

2010-12-19 22:03 453 查看
------------------------------------------------可以忽略的与主题无关的自言自语-----------------------------------------------------------------

      这个学期程序设计课的final project是用python写一个中文分词程序,还要做图形化界面。前段时间各种事情各种忙,于是就把任务拖到了这个周末,还以为一个晚上就能搞定的...嗯哼,但貌似这个project没有我想象的简单...

      由于这还是第一次写图形化界面,于是乎自然而然就各种纠结,在边看手册边修修改改的终于把一个简陋得不能再简陋的界面做出来以后,我兴奋地以为大功已经告成了四分之三,没想到之后遇到了更令我纠结的事情,which is这篇文章的主题:python中的中文编码。

     学艺不精,如果有任何错误请大家指正!



      首先要了解一些字符编码的知识,这儿有一篇很好的文章,字符编码笔记:ASCII,Unicode和UTF-8

      

在python中,很关键的一点是,代码中字符串的默认编码与你该代码文件的编码一致。(让我囧了好久的...)   

str = "坑爹"
 

         如果这段代码是在utf-8的文件中,那么str就是utf-8编码,如果是在cp936的文件中,那么str就是cp936编码。

 

 

       修改代码的编码方式

 

        
# coding: utf-8
str = "坑爹"


    

       这样就是使代码的编码方式成为utf-8,当然你也可以将utf-8替换成其他的编码方式。

       在python shell中,我猜想:汉字默认的编码方式应该就是本地系统的汉字编码。嗯,在我的xp系统中就是cp936。

 

 

       然后就是如何进行编码的转换,python的内部对字符串的操作是围绕unicode进行的。

 

        
>>> str = "坑爹"
>>> str
'/xbf/xd3/xb5/xf9'
>>> a = str.decode('cp936')
>>> a
u'/u5751/u7239'
>>> b = a.encode('utf-8')
>>> b
'/xe5/x9d/x91/xe7/x88/xb9'
 

 

         以上代码是在我的python shell中运行的,所以str的编码是cp936。

 

         decode的作用是将其他编码的字符串转换成unicode编码。

         第四行中的str.decode('cp936')就是将cp936编码的字符串str转换成unicode编码。

         encode的作用是将unicode编码转换成其他编码的字符串。

         第七行中的a.encode('utf-8')就是将unicode编码的字符串a转换成utf-8编码。

 

 

  基本上就这些了,最后是一些杂七杂八的东西。

#判断s是否为unicode
isinstance(s, unicode)
#获得系统的默认编码
import sys
print sys.getdefaultencoding()
#获得本地系统的编码
import locale
locale.getdefaultlocale()
 

 

 系统和本地系统是什么?不要问我,我也不知道。。。 (请大牛们赐教)

 

-----------------------------------------又是可以忽略的与主题无关的自言自语---------------------------------------------------------------------------

写出来只有这么一点。。。我忽然又有一种怎么这么简单我当时在搞虾米东东的感觉。。。哎。。。弄了好几个小时的。。。T__T

就这样吧。

       贴一个最后的成果吧

 

 



 

-------------------------------------------------n天之后我再一次被python的编码问题击败----------------------------------------------------

         u前缀表示后面跟的那个字符串常量是一个Unicode字符串。但它仅仅表示这是一个Unicode字符串,对字符串本身的编码却没有做任何改变。比如:

s = u"测试" 
s的值是:

 

 

 u'/xb2/xe2/xca/xd4'


s = "测试" 
s的值是:

 

 '/xb2/xe2/xca/xd4'
可以看到,除了前面的u前缀外,字符内部编码没有丝毫差别。因此,我们要得到一个Unicode的中文字符串,u前缀并不是一个好方法。那么u前缀有什么作用呢?我的猜想是对非英语字符可能能起作用,未经证实,猜错不管。

和u前缀不同,unicode函数有一个转换编码的过程,在转换过程中,用到了codecs。

s = unicode("测试", "gb2312") 
s的值是:

u'/u6d4b/u8bd5' 
可以看
4000
到,这时的s,是一个真正的双字节Unicode编码字符串了。

 

 

今天还发现个奇怪的事情,我将一个字典从txt读进来,结果发现开头多了3个字节的奇怪东西...哎 身心俱疲 无力研究了 先放这儿吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息