关于编解码器和utf-8的python noob问题

时间:2011-06-28 23:17:44

标签: python utf-8

使用python来挑选它,所以绝对是一个菜鸟?在这里,但没有看到满意的答案。

我有一个json utf-8文件,其中包含一些有严重,精确等等的文件....我正在使用编解码器并且有(例如):

str=codecs.open('../../publish_scripts/locations.json', 'r','utf-8')
locations=json.load(str)

for location in locations:
    print location['name']

对于打印,是否需要做任何特殊的事情?它给了我以下
ascii'编解码器不能编码位置5中的字符u'\ xe9'

看起来e-accute的正确utf-8值。我怀疑我在打印方面做错了。迭代会导致它失去它的utf-8'吗?

PHP和Ruby版本处理utf-8件很好;那些python不会做的语言有些松散吗?

THX

4 个答案:

答案 0 :(得分:3)

codec.open()将使用您提供的编解码器解码文件的内容(utf-8)。然后你有一个python unicode对象(其行为与字符串对象类似)。

使用默认编解码器(通常为ascii)打印unicode对象将导致 implict (幕后)编码。如果ascii无法对所有存在的字符进行编码,则会失败。

要打印它,首先应编码,因此:

for location in locations:
    print location['name'].encode('utf8')

编辑:

对于您的信息,json.load()实际上采用类似文件的对象(codecs.open()返回的内容)。你在那时所拥有的既不是字符串也不是unicode对象,而是文件周围的可迭代包装器。

默认情况下json.load()期望文件采用utf8编码,因此您的代码段可以简化:

locations = json.load(open('../../publish_scripts/locations.json'))
for location in locations:
    print location['name'].encode('utf8')

答案 1 :(得分:2)

您可能正确地阅读了该文件。您正在打印时发生错误。 Python尝试将unicode字符串转换为ascii,并在位置5的字符上失败。

请改为尝试:

print location['name'].encode('utf-8')

如果您的终端设置为期望以utf-8格式输出,则会正确打印。

答案 2 :(得分:0)

与PHP相同。 UTF8字符串很适合打印。

答案 3 :(得分:0)

标准io流在python2和一些site.py设置中针对非ascii,字符io而被破坏。基本上,您需要在脚本的早期sys.setdefaultencoding('utf8')(或系统区域设置的编码)。使用ubuntu中提供的site.py,您需要imp.reload(sys)才能使sys.setdefaultencoding可用。或者,您可以将sys.stdout(和stdin和stderr)包装为可识别unicode的读者/编写者,您可以从codecs.getreader / getwriter获取。