Python 2.7:如何从shell传递诸如'café'之类的参数而不是'cafÚ'?

时间:2012-09-19 10:08:07

标签: python shell encoding arguments diacritics

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

如果我传入英文单词(即没有重音等),它就可以了。然而,如果我传入,即'café',我会'cafú'(print sys.argv[1]导致cafÚ而不是café。)

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

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

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

1 个答案:

答案 0 :(得分: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"代替,然后它应该有用。

说明:(有些猜测)

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

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

或者切换到Python 3,这使得所有这些变得更加容易。