在Python中读取latin-1编码字符串时出现'ASCII'转Unicode错误
我在处理一些用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 个回答
试试这个:
print(repr(unicode(data, 'iso-8859-1')))
当你打印一个unicode对象时,其实是在尝试把它转换成默认的编码格式,也就是ASCII。使用repr
可以把它转成一种ASCII安全的格式,这样你在调试的时候更容易理解发生了什么。
你是在用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标志,就应该能解决。