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

关于编解码器和utf-8的python noob问题,python,utf-8,Python,Utf 8,使用python来挑选一些片段,所以肯定是一个noob?但没有看到令人满意的答案 我有一个json utf-8文件,其中有些片段有grave's、accute's等。。。。我正在使用编解码器,并且(例如): 对于印刷,有什么特别需要做的吗?它给了我以下信息 ascii“编解码器无法对位置5中的字符u'\xe9'进行编码 它看起来是e-accute的正确utf-8值。我怀疑我在打印方面做错了什么。迭代会导致它失去utf-8的特性吗 PHP和Ruby版本可以很好地处理utf-8;这些语言中是否存在p

使用python来挑选一些片段,所以肯定是一个noob?但没有看到令人满意的答案

我有一个json utf-8文件,其中有些片段有grave's、accute's等。。。。我正在使用编解码器,并且(例如):

对于印刷,有什么特别需要做的吗?它给了我以下信息
ascii“编解码器无法对位置5中的字符u'\xe9'进行编码

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

PHP和Ruby版本可以很好地处理utf-8;这些语言中是否存在python无法做到的松散性


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

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

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

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

要打印,应首先对其进行编码,因此:

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

对于您的信息,
json.load()
实际上获取了一个类似文件的对象(这就是
codecs.open()
返回的内容)。此时,您所拥有的既不是字符串也不是unicode对象,而是一个围绕文件的iterable包装器

默认情况下,
json.load()
希望文件采用utf8编码,以便简化代码片段:

locations = json.load(open('../../publish_scripts/locations.json'))
for location in locations:
    print location['name'].encode('utf8')
open()将使用您提供的编解码器(utf-8)对文件内容进行解码。然后有一个python unicode对象(其行为类似于字符串对象)

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

要打印,应首先对其进行编码,因此:

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

对于您的信息,
json.load()
实际上获取了一个类似文件的对象(这就是
codecs.open()
返回的内容)。此时,您所拥有的既不是字符串也不是unicode对象,而是一个围绕文件的iterable包装器

默认情况下,
json.load()
希望文件采用utf8编码,以便简化代码片段:

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

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

请尝试以下方法:

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

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

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

请尝试以下方法:

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

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

对于python2中的非ascii、字符io和一些
site.py
设置,标准io流被中断。基本上,您需要在脚本的早期使用
sys.setdefaultencoding('utf8')
(或任何系统语言环境的编码)。ubuntu附带了
site.py
,您需要
imp.reload(sys)
才能使用
sys.setdefaultencoding
。或者,您可以将sys.stdout(以及stdin和stderr)包装为支持unicode的读写器,您可以从
codecs.getreader
/
getwriter
对于非ascii、python2中的字符io和一些
site.py
设置,标准io流被中断。基本上,您需要在脚本的早期使用
sys.setdefaultencoding('utf8')
(或任何系统语言环境的编码)。ubuntu附带了
site.py
,您需要
imp.reload(sys)
才能使用
sys.setdefaultencoding
。或者,您可以将sys.stdout(以及stdin和stderr)包装为支持unicode的读写器,您可以从
codecs.getreader
/
getwriter

中获得这些读写器。没有任何东西会被破坏,依靠更改站点范围的默认编码是一个坏主意。它可能会产生超出脚本范围的后果。最好是直言不讳;输入时解码,输出时编码。在我看来,让
print
不适用于字符串是不正确的。在代码中添加编码调用当这正是系统编码的本意时,我发现是多余的。没有任何东西会被破坏,依靠改变站点范围的默认编码是一个坏主意。它可能会产生超出脚本范围的后果。最好是直言不讳;输入时解码,输出时编码。在我看来,让
print
不适用于字符串是不正确的。在代码中添加编码调用当这正是系统编码的目的时,我发现冗余。