【发布时间】: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”),这通常不会显示异常。那么你就知道异常是虚假的。