在Python中读取latin-1编码字符串时出现'ASCII'转Unicode错误

1 投票
2 回答
1023 浏览
提问于 2025-04-15 19:28

我在处理一些用latin-1(ISO-8859-1)编码的字符串时遇到问题。

我想做的是通过HTTP POST从一个使用ISO-8859-1编码的网页发送一些数据到我的Python应用程序,然后在我的Python脚本中用正则表达式解析这些数据。

这个网页使用jQuery把数据发送到服务器,我是通过.text()方法从页面获取文本的。当数据发送回服务器时,它看起来像这样:re.compile(r"^[\s,]*(\d*\s*\d*\/*\d)[\s,]*")。不幸的是,我的正则表达式中的\s没有匹配到我的数据,我追踪问题发现,网页使用了 ,这被编码成了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 个回答

2

试试这个:

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

当你打印一个unicode对象时,其实是在尝试把它转换成默认的编码格式,也就是ASCII。使用repr可以把它转成一种ASCII安全的格式,这样你在调试的时候更容易理解发生了什么。

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.compile()中使用了re.UNICODE标志,就应该能解决。

撰写回答