【问题标题】:How to completely sanitize a string of illegal characters in python?如何彻底清理python中的一串非法字符?
【发布时间】:2010-12-27 01:28:23
【问题描述】:

我的程序有一个功能,用户可以上传一个 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"),不管它抛出什么错误。

我该怎么做才能让这个东西成为一个工作字符串?

【问题讨论】:

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

标签: python unicode


【解决方案1】:

您可以通过“忽略”跳过 .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')。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        你也可以使用:

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

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

        ** ps,在网站上它被指出使用python,但我在python3中测试过,它工作得很好

        【讨论】:

          猜你喜欢
          • 2013-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-05
          • 2011-10-28
          • 1970-01-01
          相关资源
          最近更新 更多