最近遇到一个需求是要清除中文字串中的全角空格(数据是GBK编码,全角空格的GBK编码是\xa1\xa1)。
一开始直接使用str.replace(‘ ’,‘’)来去除,结果是部分结果出现乱码,经过分析,知道了python中的str类是“字节串”,匹配的时候是按照字节进行匹配的,所以如果\xa1\xa1是分布是两个字符之间,也会被去掉,因而导致结果不是我们想要的,比如这个例子:
1
2
3
4
5
6
|
# -*- <span class="goog_qs-tidbit goog_qs-tidbit-1">coding: cp936 -*-
string1
=
'\xa1\xa1\xb0\xe9'
#GBK下显示为“ 伴”</span>
string2
=
'\xb0\xa1\xa1\xe9'
#GBK下显示为“啊¢”
print
string1.replace(
' '
, '')
print
string2.replace(
' '
, '')
|
输出结果都是“伴”。这个结果对于第一个字符串是正确的,而对于第二个字符串是错误的,因为第二个字串中的\xa1\xa1并不是一个独立的字符,而是“啊”(\xb0\xa1)的后半截加上“¢”(\xa1\xe9)的前半截,而且却被匹配剔除掉了。
为了解决这个问题,需要使用unicode进行编码,unicode编码的字符串才算是真正意义上的字符串,因为它真的是按照“字符”进行计数的。下面例子可以说明:
1
2
|
print
len
(
"啊¢"
)
#输出4(个字节)
print
len
(u
"啊¢"
)
#输出2(个字符)
|
知道这个之后就有思路了:先把原字符串编码成unicode,然后进行全角空格剔除,就不会出现问题了,测试语句如下(其中u’\u3000′是全角空格的unicode编码):
1
2
3
4
5
6
7
|
# -*- coding: cp936 -*-
string1
=
'\xa1\xa1\xb0\xe9'
#GBK下显示为“ 伴”
string2
=
'\xb0\xa1\xa1\xe9'
#GBK下显示为“啊¢”
print
string1.decode(
'GBK'
).replace(u
'\u3000'
, u'')
#输出“伴”
print
string2.decode(
'GBK'
).replace(u
'\u3000'
, u'')
#输出“啊¢”
|
大功告成,如果要把unicode重新变成GBK编码的话,用unicode.encode(‘GBK’)即可。
关于python对编码处理,更详细的参考这篇文章:
http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html