如何在python中完全清理一串非法字符?

时间:2009-12-16 00:44:01

标签: python unicode

我有一个程序的功能,用户可以上传一个csv文件,我的程序经过该文件并用作输入。我有一个用户抱怨他的输入引发错误的问题。错误是由于编码错误的非法字符造成的。字符如下:

有时它看起来像一颗带有“?”的钻石。在中间。有时它看起来像双钻石“?”在中间,有时它显示为“\ xa0”,有时它显示为“\ xa0 \ xa0”。

如果我在我的计划中:

print str_with_weird_char

striong将在我的终端上出现钻石“?”代替奇怪的角色。如果我将该字符串复制+粘贴到ipython中,它将退出并显示以下消息:

In [1]: g="blah��blah"
WARNING: 
********
You or a %run:ed script called sys.stdin.close() or sys.stdout.close()!
Exiting IPython!

注意钻石“?”现在加倍了。由于某种原因,复制+粘贴会使它加倍...

在django追溯页面中,它看起来像这样:

UnicodeDecodeError at /chris/import.html
('ascii', 'blah \xa0 BLAH', 14, 15, 'ordinal not in range(128)')

让我感到困惑的是,如果没有它,我就不能对这个字符串做任何事情。我尝试了unicode(),我尝试了str(),我尝试了.encode(),我尝试了.encode(“utf-8”),无论它是什么引发了错误。

我能做些什么让这个东西成为一个有效的字符串?

4 个答案:

答案 0 :(得分:9)

您可以传递“忽略”以跳过.encode / .decode中的无效字符 比如"ILLEGAL".decode("utf8","ignore")

>>> "ILLEGA\xa0L".decode("utf8")
...
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa0 in position 6: unexpected code byte

>>> "ILLEGA\xa0L".decode("utf8","ignore")
u'ILLEGAL'
>>>

答案 1 :(得分:3)

在脚本的第二行声明编码。它真的必须是第二。像

#!/usr/bin/python
# coding=utf-8

这可能足以解决您的问题。如果没有,请参阅str.encode('utf-8')和str.decode('utf-8')。

答案 2 :(得分:1)

唯一的方法(至少在python2中)是使用unicodedata.normalize:

unicodedata.normalize('NFKD', text).encode('utf-8', 'ignore')

decode('utf-8','ignore')只会引发异常。

答案 3 :(得分:1)

您还可以使用:

python3 -c "import urllib, sys ; print urllib.quote_plus(sys.stdin.read())";

取自https://wiki.python.org/moin/Powerful%20Python%20One-Liners

** ps,在网站上它指向使用python,但是我在python3中进行了测试,效果很好