使用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
答案 0 :(得分:3)
codec.open()将使用您提供的编解码器
使用默认编解码器(通常为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
获取。