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

pri*_*stc 5 python unicode

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

?
Run Code Online (Sandbox Code Playgroud)

有时它看起来像一个带有"?"的钻石.在中间.有时它看起来像双钻石"?" 在中间,有时它显示为"\ xa0",有时它显示为"\ xa0\xa0".

在我的计划中,如果我这样做:

print str_with_weird_char
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

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

YOU*_*YOU 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'
>>>
Run Code Online (Sandbox Code Playgroud)