Python:UnicodeEncodeError:'latin-1'编解码器无法对位置中的字符进行编码

5
我得到了这个错误:
File "run.py", line 37, in <module>
 print str1
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 24-29: ordinal not in range(256)

当尝试简单打印一些日语文本时,实际上字符串看起来像这样:
\u5149\u66dc\u65e5\u3067\u30e9\u30c6 \u30d4\u30af\u30b7\u30fc\u4e71\u7372\u884c\u304d\u307e\u3059 \u5e0c\u671b\u8005\u52df\u96c6\u4e2d\u3067\u3059\uff3e\uff3e 它是从JSON文件中获取的。如何打印这个字符串?
代码:
url = "http://www.blah.com/json"
try:
  result = simplejson.load(urllib2.urlopen(url))
except IOError:
  print "Cannot open URL"
  data = "error"

for msg in result["msg"]:
  str1 = msg["character"] + " : " + msg["message"]
  print str1

repr(str1) 是

u'Anys : \u5149\u66dc\u65e5\u3067\u30e9\u30c6 \u30d4\u30af\u30b7\u30fc\u4e71\u7372\u884c\u304d\u307e\u3059 \u5e0c\u671b\u8005\u52df\u96c6\u4e2d\u3067\u3059\uff3e\uff3e'

打印(sys.stdout.encoding)是

ISO-8859-1

你的代码是什么样子的?你的文本使用哪种编码?正如其名称所示,Latin-1无法编码日语字符。 - Wooble
请发布 repr(str1)print(sys.stdout.encoding) - unutbu
这个系统是什么?它将sys.stdout检测为latin-1编码,而在Latin 1中无法写入日语字符。 - Thomas K
我已经添加了完整的代码,对此很抱歉。 - Zeno
unutbu: 我把它们编辑到了我的帖子中。 - Zeno
可能是重复的问题:UnicodeEncodeError: 'latin-1' codec can't encode character - ivan_pozdeev
1个回答

4
您看到的错误是因为您的终端使用latin-1作为编码。顺便提一下,您可以通过在shell中执行以下命令来检查您的终端编码(假设它是您的标准输出):
$ python -c "import sys; print sys.stdout.encoding"

现在如果需要在 UTF-8 中打印文本,您应该手动将字符串编码为 utf-8,如下所示:

s = u"\u5149\u66dc\u65e5\u3067\u30e9\u30c6 \u30d4\u30af\u30b7\u30fc\u4e71\u7372\u884c\u304d\u307e\u3059 \u5e0c\u671b\u8005\u52df\u96c6\u4e2d\u3067\u3059\uff3e\uff3e"
print s.encode('utf-8')
#Output: 光曜日でラテ ピクシー乱獲行きます 希望者募集中です^^

谢谢,就是那个方法。不知道为什么我之前尝试了别人建议的另一种.encode()方式,结果又产生了错误。 - Zeno
我不相信这是正确的答案。您不应该手动编码为UTF-8。你应该设置你的输出流编码为那个。 - tchrist
如果终端字符编码为 UTF-8,则上述(打印字节)在 Unix 上可以正常工作。但正如 tchrist 指出的那样,这不是一般解决方案。在 Windows 上,控制台是基于字符而不是基于字节。或者尝试 sys.stdout = codecs.getwriter('UTF-8')(sys.stdout) 然后简单地输出 print s - wberry
@wberry,@tchrist:据我所知,窗口控制台仅显示256个字符(cp437),将stdout编码设置为UTF8不被推荐(请参见:http://wiki.python.org/moin/PrintFails)。据我所知,在Python 2中没有通用的解决方案来解决打印编码失败问题,我认为解决方案将因您所做的事情而异。如果您想要记录,请使用“logging”模块而不是print;如果您只想调试程序,我会采用我的解决方案(在需要时使用正确的编码进行编码),当在程序中使用子进程或线程时,情况也可能变得很丑陋... - mouad
即使在Python 3中,Windows控制台也没有通用解决方案。C stdio库和控制台本身在Windows实现中的限制会阻止可靠的Unicode输出。这也影响了许多其他语言和工具。 - bobince

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接