【问题标题】:'ASCII' to Unicode error in python when attempting to read a latin-1 encoded string尝试读取 latin-1 编码字符串时,python 中的“ASCII”到 Unicode 错误
【发布时间】:2010-02-19 06:36:29
【问题描述】:

我在尝试将正则表达式应用于以 latin-1 (ISO-8859-1) 编码的某些字符串时遇到问题。

我要做的是通过 HTTP POST 从以 ISO-8859-1 编码的页面向我的 python 应用程序发送一些数据,并在我的 python 脚本中使用正则表达式对数据进行一些解析。

网页使用 jQuery 将数据发送到服务器,我使用 .text() 方法从页面中获取文本。将数据发送回服务器后,如下所示:re.compile(r"^[\s,]*(\d*\s*\d*\/*\d)[\s,]*") - 不幸的是,我的正则表达式中的 \s 与我的数据不匹配,我将问题追溯到 html 页面使用   的事实被编码为0xA0(不间断空格)并发送到服务器。出于某种原因,我的脚本似乎没有将该字符解释为空格并且不匹配。根据 python [documentation][1] 看起来这应该可以工作,所以我必须在这里遇到编码问题。

然后我想尝试将字符串转换为 unicode 并将其传递给正则表达式,因此我尝试查看转换字符串时会发生什么:print(unicode(data, 'iso-8859-1'))

不幸的是,我收到了这个错误: UnicodeEncodeError at /script/ 'ascii' codec can't encode character u'\xa0' in position 122: ordinal not in range(128)

不过我很困惑——我显然不是在尝试使用 ASCII 解码——python 是否在尝试使用 ASCII 进行解码,即使我显然在传递另一个编解码器?

【问题讨论】:

  • 如果这些解决方案之一回答了您的问题,您应该将它们标记为已接受
  • 谢谢,作为一名 n00b,我昨晚一直在寻找“已接受”或“已回答”按钮,但没有找到。多一点刺激使我发现了复选标记。

标签: python encoding


【解决方案1】:

试试这个:

print(repr(unicode(data, 'iso-8859-1')))

通过打印一个 unicode 对象,您隐式地尝试将其转换为默认编码,即 ASCII。使用 repr 会将其转义为 ASCII 安全形式,而且您可以更轻松地了解调试过程中发生了什么。

【讨论】:

  • +1,但请注意,这现在很有用,但不适用于全局。如果你想避免这些问题,你最好开始学习一些关于编码的知识。
  • 我不确定我是否理解您的观点 - 有用的部分是了解 print() 会隐式转换为默认编码。
【解决方案2】:

您使用的是 Python 3.X 还是 2.X?它有所作为。实际上看起来像 2.X 但你使用 print(blahblah) 让我感到困惑:-)

回答您的最后一个问题:是的,当您执行print() 时默认为 ASCII。在 3.X 上:使用 print(ascii(foo)) 进行调试,而不是 print(foo)。在 2.X 上使用 repr(),而不是 ascii()

如果 (a) 数据是 unicode 并且 (b) 您使用 re.UNICODE 标志和 re.compile()

【讨论】:

  • 是的,2.6-感谢repr() 技术。回复:原来的问题 - re.UNICODE 是诀窍 - 谢谢!
猜你喜欢
  • 2018-12-11
  • 2015-02-03
  • 2016-06-19
  • 1970-01-01
  • 2011-08-11
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
相关资源
最近更新 更多