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

JR *_*rez 2 python shell encoding arguments diacritics

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

如果我传入英语单词(即没有重音符号等),它就可以正常工作.然而,如果我传入,即'café',我会得到'cafú'(print sys.argv[1]结果cafÚ代替café).

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

Q = unicode(sys.argv[1], encoding=sys.stdin.encoding)
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*ker 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Ú
Run Code Online (Sandbox Code Playgroud)

encoding="cp1252"相反,使用它应该工作.

说明:(有些猜测)

  • cmdwindows cp850用作默认代码页.这是从上面我的会议的第二行明显的,0x82écp850.
  • 看来,Python程序在Windows下使用开始cp1252作为他们的标准编码,通过上述会议的最后一行中显示:é0xe9cp1252(如以Unicode).
  • 当你将这个字符串写入一个文件(默认情况下使用cp1252)时,这也很明显:
    如果我这样做f.write(a),我会得到caf,我文件的内容,因为,0x82cp1252.).
    如果我这样做f.write(a.decode("cp850").encode("cp1252")),我会café.

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

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