Jus*_*808 12 python unicode utf-8 python-2.7
我正在尝试在python 2.7.2中处理unicode.我知道有.encode('utf-8')什么东西,但是我添加它的时间是1/2,我得到错误,而且当我不添加它时,我得到错误的时间是1/2.
有什么方法可以告诉python - 我认为这是一种最新的现代语言,只使用字符串的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)
Run Code Online (Sandbox Code Playgroud)
更新
如果我.encode从我的所有代码中删除所有语句并添加# -*- coding: utf-8 -*-到我的文件顶部,#!/usr/bin/python那么我就得到以下内容,就好像我根本没有添加它一样# -*- coding: 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'
Run Code Online (Sandbox Code Playgroud)
我不是手动输入任何字符串,我从网站解析HTML和json.所以脚本/字节流/无论它们是什么,都是由python创建的.
更新2我可以移动错误,但它只是不断出现在新的地方.我希望python会是一个有用的脚本工具,但看起来好像没有运气3天后我会尝试不同的语言.很遗憾,在osx上预装了python.我已经标记了修正我发布的错误的一个实例的答案.
Sha*_*arG 20
这是一个非常古老的问题,但只是想添加一个部分建议.虽然我与OP的痛苦表示同情 - 已经通过它去了很多自己 - 这里有一个(部分)的答案,使事情"更容易".把它放在任何Python 2.7脚本的顶部:
from __future__ import unicode_literals
这将至少确保您自己的文字字符串默认为unicode而不是str.
Mu *_*ind 18
除了在任何地方使用unicode字符串并立即解码您收到的任何编码字符串之外,没有办法使unicode"正常工作".问题是,无论您是处理编码数据还是未编码数据,还是使用能够为您跟踪数据的工具,或者您将度过一段美好时光,您都必须保持直线.
Python 2做了一些有问题的事情:它使得str"默认"而不是unicode像字符串文字这样的东西,它在你添加两者时默默地强制str执行unicode,它允许你调用.encode()已经编码的字符串来进行双重编码它.因此,有很多python编码器和python库不知道他们设计的编码是什么,但仍然设计用于处理某些特定的编码,因为该str类型旨在让程序员管理编码本身.每次使用这些库时都必须考虑编码,因为它们unicode本身不支持这种类型.
在您的特定情况下,第一个错误告诉您正在处理编码的UTF-8数据并尝试对其进行双重编码,而第二个错误则告诉您正在处理未编码的数据.它看起来像你可能有两个.你应该找到并修复问题的根源(我怀疑它与我上面提到的无声强制有关),但这是一个应该在短期内修复它的黑客:
encoded_title = title
if isinstance(encoded_title, unicode):
encoded_title = title.encode('utf-8')
Run Code Online (Sandbox Code Playgroud)
如果这实际上是一个无声强制咬你的情况,你应该能够使用优秀的unicode-nazi工具轻松追踪问题:
python -Werror -municodenazi myprog.py
Run Code Online (Sandbox Code Playgroud)
这将在unicode泄漏到您的非unicode字符串时向您提供回溯,而不是尝试从实际问题中解决此异常方式.有关详细信息,请参阅此相关问题的答案.
| 归档时间: |
|
| 查看次数: |
11063 次 |
| 最近记录: |