最近遇到一个需求是要清除中文字串中的全角空格(数据是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
本文介绍如何在Python中正确地移除GBK编码文本里的全角空格,避免因直接使用str.replace导致的乱码问题。通过将字符串转换为Unicode编码并替换全角空格的Unicode值,实现准确的空格移除。
2008

被折叠的 条评论
为什么被折叠?



