Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何彻底清除python中的非法字符字符串?_Python_Unicode - Fatal编程技术网

如何彻底清除python中的非法字符字符串?

如何彻底清除python中的非法字符字符串?,python,unicode,Python,Unicode,我的程序有一个功能,用户可以上传一个csv文件,我的程序将其作为输入。我有一个用户抱怨他的输入出现了错误。错误是由于存在编码错误的非法字符造成的。字符如下: � 有时它是一个菱形,中间有一个“?”,有时它看起来像是一个双钻石,中间有“?”,有时它看起来是“\xA0”,有时它看起来是“\xa0\xa0”。 在我的程序中,如果我这样做: print str_with_weird_char 字符串将显示在我的终端中,菱形“?”将代替奇怪的字符。如果我将该字符串复制并粘贴到ipython中,它将退出

我的程序有一个功能,用户可以上传一个csv文件,我的程序将其作为输入。我有一个用户抱怨他的输入出现了错误。错误是由于存在编码错误的非法字符造成的。字符如下:

有时它是一个菱形,中间有一个“?”,有时它看起来像是一个双钻石,中间有“?”,有时它看起来是“\xA0”,有时它看起来是“\xa0\xa0”。 在我的程序中,如果我这样做:

print str_with_weird_char
字符串将显示在我的终端中,菱形“?”将代替奇怪的字符。如果我将该字符串复制并粘贴到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”),不管它抛出什么错误

我该怎么做才能使它成为一个工作字符串?

您可以通过“忽略”跳过.encode/.decode中的无效字符 类似于“非法”。解码(“utf8”,“忽略”)


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

#!/usr/bin/python
# coding=utf-8
这可能足以单独解决您的问题。如果没有,请参见str.encode('utf-8')和str.decode('utf-8')

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

unicodedata.normalize('NFKD', text).encode('utf-8', 'ignore')
解码('utf-8','ignore')只会引发异常。

您还可以使用:

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

**顺便说一句,网站上指出它使用python,但我在python3中进行了测试,它工作得很好,你对它“无能为力”的原因可能是因为你尝试的所有事情都涉及到在提示符下键入表达式。交互式解释器通过对每个表达式调用repr()来显示其结果。有时这会导致解码错误,因为您的控制台无法处理Unicode(或其他原因?)。如果你得到这样一个东西,试着给它分配一个虚拟名称(例如“x=foo”而不是“foo”),这样通常不会显示异常。那么你就知道这个例外是假的。
python3 -c "import urllib, sys ; print urllib.quote_plus(sys.stdin.read())";