2009-12-16 98 views
5

我有我的程序的一个功能,用户可以上传一个csv文件,我的程序经过并用作输入。我有一位用户抱怨他的输入引发了错误。错误是由于存在编码错误的非法字符引起的。字符如下:如何彻底清理python中的非法字符字符串?

有时它看起来像一个带“?”的钻石,在中间。有时它看起来像是一个双“钻石”,“?”在中间,有时显示为“\ 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”),无论它抛出什么错误。

我能做些什么得到这个东西是一个工作的字符串?

+0

顺便说一句,你“无法做任何事”的原因可能是因为你尝试的所有事情都涉及在提示符下键入表达式。交互式解释器通过调用repr()来显示每个表达式的结果。有时候会导致解码错误,因为您的控制台不处理Unicode(或其他原因?)。如果你得到这样的东西,尝试将它分配给一个虚拟名称(例如“x = foo”而不是“foo”),并且通常不会显示异常。那么你知道这个例外是虚假的。 –

回答

6

可以传递,“忽略”跳过.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' 
>>> 
2

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

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

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