2

我有一个从 shell 获取参数的程序。此参数将是搜索操作中使用的查询。

如果我输入英语单词(即没有口音等),它可以正常工作。然而,如果我传入,即“café”,我会得到“cafú”(print sys.argv[1]结果是cafÚ而不是café)。

我以为我可以通过将其转换为 Unicode 对象来解决问题,但我错了。

Q = unicode(sys.argv[1], encoding=sys.stdin.encoding)

我仍然得到'cafÚ'!我要疯了...

4

1 回答 1

6

我敢打赌你在 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",然后它应该可以工作。

解释:(有一些猜测)

  • cmdwindowscp850用作其默认代码页。从我上面会话的第二行可以明显看出这一点0x82écp850.
  • 似乎在 Windows 下启动的 Python 程序将cp1252其用作标准编码,如上面会话的最后一行所示:éis 0xe9in cp1252(如 Unicode)。
  • 当您将此字符串写入文件(默认情况下使用cp1252)时,这一点也很明显:
    如果这样做f.write(a),我将获得文件的内容,caf,因为,在)。 如果我这样做,我会得到。0x82cp1252
    f.write(a.decode("cp850").encode("cp1252"))café

道德:在您的环境中找出正确的编码,尽快将所有内容转换为 Unicode,使用它,然后再转换回您需要的编码。如果要输出到交互式窗口,请使用cp850,如果要输出到文件中,请使用cp1252.

或者切换到 Python 3,这会使这一切变得更容易。

于 2012-09-19T10:17:25.743 回答