我有一个从 shell 获取参数的程序。此参数将是搜索操作中使用的查询。
如果我输入英语单词(即没有口音等),它可以正常工作。然而,如果我传入,即“café”,我会得到“cafú”(print sys.argv[1]
结果是cafÚ
而不是café
)。
我以为我可以通过将其转换为 Unicode 对象来解决问题,但我错了。
Q = unicode(sys.argv[1], encoding=sys.stdin.encoding)
我仍然得到'cafÚ'!我要疯了...
我有一个从 shell 获取参数的程序。此参数将是搜索操作中使用的查询。
如果我输入英语单词(即没有口音等),它可以正常工作。然而,如果我传入,即“café”,我会得到“cafú”(print sys.argv[1]
结果是cafÚ
而不是café
)。
我以为我可以通过将其转换为 Unicode 对象来解决问题,但我错了。
Q = unicode(sys.argv[1], encoding=sys.stdin.encoding)
我仍然得到'cafÚ'!我要疯了...
我敢打赌你在 Windows 上,对吧?
>>> a = "café"
>>> a
'caf\x82'
>>> print a
café
>>> a.decode("cp850") # DOS codepage 850 --> Unicode
u'caf\xe9'
>>> a.decode("cp850").encode("cp1252") # DOS 850 --> Unicode --> Windows 1252
'caf\xe9' # identical to Unicode codepoint
>>> print a.decode("cp850").encode("cp1252") # Display a cp1252 string in cp850
cafÚ
改为使用encoding="cp1252"
,然后它应该可以工作。
解释:(有一些猜测)
cmd
windowscp850
用作其默认代码页。从我上面会话的第二行可以明显看出这一点0x82
,é
在cp850
.cp1252
其用作标准编码,如上面会话的最后一行所示:é
is 0xe9
in cp1252
(如 Unicode)。cp1252
)时,这一点也很明显:f.write(a)
,我将获得文件的内容,caf,
因为,
在)。
如果我这样做,我会得到。0x82
cp1252
f.write(a.decode("cp850").encode("cp1252"))
café
道德:在您的环境中找出正确的编码,尽快将所有内容转换为 Unicode,使用它,然后再转换回您需要的编码。如果要输出到交互式窗口,请使用cp850
,如果要输出到文件中,请使用cp1252
.
或者切换到 Python 3,这会使这一切变得更容易。