有没有一个简单的方法来使unicode工作在python?

我试图在 python 2.7.2中处理unicode.我知道有.encode(‘utf-8’)的东西,但是当我添加它的时候的1/2,我得到错误,和1/2的时候,我不添加它,我得到错误.

有没有办法告诉蟒蛇 – 我以为是一个最新的&现代语言只是使用unicode的字符串,而不是让我不得不用.encode(‘utf-8’)的东西放屁?

我知道… python 3.0应该这样做,但我不能使用3.0和2.7不是所有那些老…

例如:

url = "http://en.wikipedia.org//w/api.php?action=query&list=search&format=json&srlimit=" + str(items) + "&srsearch=" + urllib2.quote(title.encode('utf-8'))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 19: ordinal not in range(128)

更新
如果我从我的所有代码中删除所有的.encode语句,并将# – * – 编码:utf-8 – *添加到我的文件的顶部,就在#!/usr/bin/python下,然后我得到以下内容,就像我没有添加# – * – 编码:utf-8 – *一样.

/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py:1250: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
  return ''.join(map(quoter, s))
Traceback (most recent call last):
  File "classes.py", line 583, in <module>
    wiki.getPage(title)
  File "classes.py", line 146, in getPage
    url = "http://en.wikipedia.org/w/api.php?action=query&prop=revisions&format=json&rvprop=content&rvlimit=1&titles=" + urllib2.quote(title)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 1250, in quote
    return ''.join(map(quoter, s))
KeyError: u'\xf1'

我没有手动输入任何字符串,我从网站解析HTML和json.所以脚本/ bytestreams /它们都是由python创建的.

更新2我可以移动错误,但它只是继续在新的地方.我希望python将是一个有用的脚本工具,但看起来像3天没有运气,我会尝试一种不同的语言.它是一个耻辱,python是预安装在osx上.我已经标记了修正我发布的错误的一个实例的答案.

除了在任何地方使用unicode字符串,并且立即解码您收到的任何编码字符串,没有办法使unicode“正常工作”.问题是,您必须始终保持直线,无论您是处理编码或未编码的数据,还是使用跟踪您的工具,否则将会有不好的时间.

Python 2做了一些有问题的事情:它使str成为“默认”,而不是像Unicode字符串那样的unicode,当你添加两个时,它会静默地强制str到unicode,它可以让你调用.encode()已经编码的字符串进行双重编码.因此,有很多python编码器和python库不知道它们被设计为使用什么编码,但是仍然设计为处理某些特定的编码,因为str类型被设计为让程序员自己管理编码.每次使用这些库时,都必须考虑编码,因为它们不支持unicode类型.

在特定情况下,第一个错误告诉您,您正在处理编码的UTF-8数据,并尝试对其进行双重编码,而第2个则说明您正在处理未编码的数据.看起来你可能有两个.你应该真的找到并解决问题的根源(我怀疑它与上面提到的沉默的强制有关),但这是一个黑客,应该在短期内解决它:

encoded_title = title
if isinstance(encoded_title, unicode):
    encoded_title = title.encode('utf-8')

如果这实际上是一个沉默的强迫咬你的事情,你应该可以使用优秀的unicode-nazi工具轻松地追踪问题:

python -Werror -municodenazi myprog.py

这将给你一个追溯权,unicode泄漏到你的非unicode字符串,而不是在实际问题的路上尝试排除这种异常.有关详细信息,请参阅本related question的答案.

相关文章
相关标签/搜索