尝试读取拉丁-1编码的字符串时,python中的'ASCII'到Unicode错误

时间:2010-02-19 06:36:30

标签: python encoding

尝试将正则表达式应用于以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 [文档] [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进行解码?

2 个答案:

答案 0 :(得分:2)

请改为尝试:

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

通过打印unicode对象,您隐式尝试将其转换为默认编码,即ASCII。使用repr会将其转换为ASCII安全形式,此外,您可以更轻松地找出正在进行调试的内容。

答案 1 :(得分:1)

您使用的是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()

一起使用,那么无中断空间的原始问题应该消失