Python如何处理unicode文本
我正在使用Python 2.6.6Python如何处理unicode文本,python,unicode,Python,Unicode,我正在使用Python 2.6.6 item = {u'snippet': {u'title': u'How to Pronounce Canap\xe9'}} title = item['snippet']['title'] print title 结果: How to Pronounce Canapé 预期结果: How to Pronounce Canapé 这看起来像是一个Unicode问题,我尝试了对utf8进行编码和解码,但结果还是一样,有什么想法吗?这很可能是由于Pytho
item = {u'snippet': {u'title': u'How to Pronounce Canap\xe9'}}
title = item['snippet']['title']
print title
结果:
How to Pronounce Canapé
预期结果:
How to Pronounce Canapé
这看起来像是一个Unicode问题,我尝试了对utf8进行编码和解码,但结果还是一样,有什么想法吗?这很可能是由于Python使用的默认编码与控制台的编码不匹配。看起来Python假设编码为UTF-8,但控制台将其解释为拉丁语-1。这很可能是由于Python使用的默认编码与控制台的编码不匹配。看起来Python假定编码为UTF-8,但控制台将其解释为拉丁语-1。如果可能,请使用
\u00e9
,而不是\xe9
。然后在输出unicode字符串时选择适当的编码:
print title.encode('latin1')
什么样的编码是合理的取决于输出到哪里。通常,您必须从环境变量中推断,或者让用户在配置文件中进行选择
PS:如果您经常处理Unicode字符串,我建议您尽可能切换到Python 3(例如3.3)。Unicode处理更清晰/明确/合理。如果可能,请使用
\u00e9
而不是\xe9
。然后在输出unicode字符串时选择适当的编码:
print title.encode('latin1')
什么样的编码是合理的取决于输出到哪里。通常,您必须从环境变量中推断,或者让用户在配置文件中进行选择
PS:如果您经常处理Unicode字符串,我建议您尽可能切换到Python 3(例如3.3)。Unicode处理更加清晰/明确/合理。我在我的终端中得到了您期望的输出(使用python 2.7.7) 您期望的格式取决于终端中设置的编码。对我来说,设置为“cp437”
>>> import sys
>>> sys.stdin.encoding
'cp437'
>>> sys.stdout.encoding
'cp437'
您可以通过以下方式验证是否获得正确的输出:
print title.encode('cp437')
我在我的终端中获得了您的预期输出(使用python 2.7.7) 您期望的格式取决于终端中设置的编码。对我来说,设置为“cp437”
>>> import sys
>>> sys.stdin.encoding
'cp437'
>>> sys.stdout.encoding
'cp437'
您可以通过以下方式验证是否获得正确的输出:
print title.encode('cp437')
在
${pythondir}/lib/site packages/
中的sitecustomize.py文件中将默认编码设置为iso-8859-1
import sys
sys.setdefaultencoding('iso-8859-1')
对我来说,它使用
\xe9
在${pythondir}/lib/site packages/
中的sitecustomize.py文件中将默认编码设置为iso-8859-1
import sys
sys.setdefaultencoding('iso-8859-1')
对我来说,它使用的是
\xe9
您的终端期望的UTF-8
:
$ locale charmap
UTF-8
>>> sys.stdout.encoding
UTF-8
Python使用UTF-8打印:
$ locale charmap
UTF-8
>>> sys.stdout.encoding
UTF-8
将SecureCRT设置更改为接受UTF-8。您的终端需要UTF-8:
$ locale charmap
UTF-8
>>> sys.stdout.encoding
UTF-8
Python使用UTF-8打印:
$ locale charmap
UTF-8
>>> sys.stdout.encoding
UTF-8
更改SecureCRT设置以接受UTF-8。该代码示例在我的终端中运行良好。我必须假设这是操作系统或终端的问题。您使用的是什么操作系统/终端软件?如何运行此代码?@BenEchols,操作系统是CentOS 6.4,终端是SecureCRT 4。0@BurhanKhalid,在命令行上键入python,这将我放入python外壳检查SecureCRT会话的编码,并确保其UTF8而不是拉丁语-1或类似的。该代码示例在我的终端中运行良好。我必须假设这是操作系统或终端的问题。您使用的是什么操作系统/终端软件?如何运行此代码?@BenEchols,操作系统是CentOS 6.4,终端是SecureCRT 4。0@BurhanKhalid,在命令行上键入python,这将我放入python外壳检查SecureCRT会话的编码,并确保其为UTF8而不是拉丁语-1或类似。我无法将\xe9更改为\u00e9,\xe9是来自YouTube APIOk的原始数据,这对于Python2.7来说并不重要。从您显示的输出来看,我认为
'latin1'
可能是您案例中正确的编码。@ChristianAichinger:u'\xe9'==u'\u00e9'
,因此更改它不会有帮助。更改SecureCRT
以匹配CentOS上的终端设置,而不是.encode('latin1')
。如果sys.stdout.encoding
是正确的(它匹配$LC\u TYPE
,$LANG
),那么使用Python3就不会正确help@J.F.Sebastian,当我将值写入文件系统上的文件时,我遇到了相同的错误,这是否表明问题不是安全的?@davidjhp:写入文件与写入终端不同。如果输出被重定向到一个文件,您可以使用pythonionecoding
控制标准输出编码。通过打印输出(repr(打开(“您的输出文件”,“rb”).read())?我无法将\xe9更改为\u00e9,该\xe9是来自YouTube APIOk的原始数据,这对Python2.7来说应该无关紧要。从您显示的输出来看,我认为'latin1'
可能是您案例中正确的编码。@ChristianAichinger:u'\xe9'==u'\u00e9'
,因此更改它不会有帮助。更改SecureCRT
以匹配CentOS上的终端设置,而不是.encode('latin1')
。如果sys.stdout.encoding
是正确的(它匹配$LC\u TYPE
,$LANG
),那么使用Python3就不会正确help@J.F.Sebastian,当我将值写入文件系统上的文件时,我遇到了相同的错误,这是否表明问题不是安全的?@davidjhp:写入文件与写入终端不同。如果输出被重定向到一个文件,您可以使用pythonionecoding
控制标准输出编码。使用打印输出(repr(打开(“您的输出文件”,“rb”).read())?AttributeError:“模块”对象没有属性”setdefaultencodi@davidjhp:不要这样做。从'ascii'
更改sys.getdefaultencoding()
可能会以一种微妙的方式破坏系统上的其他Python脚本。AttributeError:'module'对象没有属性'setdefaultencodi@davidjhp:不要这样做。正在更改sys.getdefaultencoding()