python的中文处理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Python的中文处理

一、使用中文字符

在python源码中如果使用了中文字符,运行时会有错误,解决的办法是在源码的开头部分加入字符编码的声明,下面是一个例子:

#!/usr/bin/env python

# -*- coding: cp936 -*-

Python Tutorial中指出,python的源文件可以编码ASCII以外的字符集,最好的做法是在#!行后面用一个特殊的注释行来定义字符集:

# -*- coding: encoding -*-

根据这个声明,Python会尝试将文件中的字符编码转为encoding编码,并且,它尽可能的将指定地编码直接写成Unicode文本。

注意,coding:encoding只是告诉Python文件使用了encoding格式的编码,但是编辑器可能会以自己的方式存储.py文件,因此最后文件保存的时候还需要编码中选指定的ecoding 才行。

二、中文字符的存储

>>> str = u"中文"

>>> str

u'\xd6\xd0\xce\xc4'

>>> str = "中文"

>>> str

'\xd6\xd0\xce\xc4'

u"中文"只是声明unicode,实际的编码并没有变。这样子就发生变化了:

>>> str = "中文"

>>> str

'\xd6\xd0\xce\xc4'

>>> str = str.decode("gb2312")

>>> str

u'\u4e2d\u6587'

更进一步:

>>> s = '中文'

>>> s.decode('gb2312')

u'\u4e2d\u6587'

>>> len(s)

4

>>> len(s.decode('gb2312'))

2

>>> s = u'中文'

>>> len(s)

4

>>> s = '中文test'

>>> len(s)

8

>>> len(s.decode('gb2312'))

6

>>> s = '中文test,'

>>> len(s)

10

>>> len(s.decode('gb2312'))

7

可以看出,对于实际Non-ASCII编码存储的字符串,python可以正确的识别出其中的中文字符以及中文上下文中的标点符号。

前缀“u”表示“后面这个字符串“是一个Unicode字符串”,这仅仅是一个声明,并不表示这个字符串就真的是Unicode了;就好比某正太声称自己已满18岁,但实际上他的真实年龄并不确定,现在体育界年龄造假可不稀罕幺!

那么声明成u有什么作用呢?对于Python来说,只要你声明某字符串是Unicode,它就会用Unicode的一套机制对它进行处理。比方说,做字符串操作的时候会动用到内部的Unicode处理函数,保存的时候以Unicode字符(双字节)进行保存。等等。显而易见,对于一个实际上并不是Unicode的字符串,做Unicode动作的处理,是有可能会出问题的。u 前缀只适用于你的字符串常量真的是Unicode的情况。

三、中文字符的IO操作

用python处理字符串很容易,但是在处理中文的时候需要注意一些问题。比如:

a = "我们是python爱好者"

print a[0]

只能输出“我”字的前半部分,要想输出整个的“我”字还需要:

b = a[0:2]

print b

才行,很不方便,并且当一段文本中同时有中英文如何处理?最好的办法就是转换为unicode。像这样:

c = unicode(a, "gb2312")

print c[0]

这个时候c的下标对应的就是每一个字符,不再是字节,并且通过len(c)就可以获得字符数!还可以很方便的转换为其他编码,比如转换为utf-8:

d = c.encode("utf-8")

四、

将字符串看作是字节的序列,而则将其看作是字符的序列,单个字符可能占用多个字节;字节相对于字符,其在存储层次中更低一些。

str转换为unicode要decode,可以这样想,因为要把字节序列解释成字符序列,字节序列是底层的存放方式,解码(decode)成更高层的字符以便使用;同理,unicode转换为str要encode,就象信息编码(encode)后才存储一样:

s.decode(encoding) to

u.encode(encoding) to

例如:

>>> s = 'str'

>>> type(s)

>>> type(s.de code())

>>> s = u'str'

>>> type(s)

>>> type(s.en code())

处理中文数据时最好采用如下方式:

1. Decode early(尽早decode, 将文件中的内容转化成unicode再进行下一步处理)

2. Unicode everywhere (程序内部处理都用unicode)

3. Encode late (最后encode回所需的encoding, 例如把最终结果写进结果文件)

下面是一个简单的演示,用re库查询一个中文字符串并打印:

>>> p = pile(unicode("测试(.*)", "gb2312"))

>>> s = unicode("测试一二三", "gb2312")

>>> for i in p.findall(s):

print i.encode("gb2312")

一二三

五、跨平台处理技巧

如果一个project必须在两个平台上开发,程序应该使用同样的encoding,比如要求所有的文件都使用UTF-8,如果实在不能统一(一般是为了满足许多所谓专家学者莫名其妙的要求),可以退而求其次,用当前系统编码决定文件内的编码:

import locale

import string

import re

#根据当前系统的encoding构造需要的编码取值

lang = string.upper(locale.setlocale(locale.LC_ALL, ""))

textencoding = None

相关文档
最新文档