2

シェルから引数を取得するプログラムがあります。この引数は、検索操作で使用されるクエリになります。

私が英語の単語を渡す場合(つまり、アクセントなしなど)、それはうまく機能します。それでも、「cafe」を渡すと、「cafú」が表示されます(の代わりにprint sys.argv[1]結果が表示されます)。cafÚcafé

Unicodeオブジェクトに変換することで問題を解決できると思いましたが、間違っていました。

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

私はまだ「カフー」を手に入れます!私はおかしくなりそうだ...

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"代わりに使用すると、機能するはずです。

説明:(当て推量あり)

  • cmdWindowsはcp850デフォルトのコードページとして使用します。これは、上記の私のセッションの2行目から明らか0x82です。écp850
  • 上記のセッションの最後の行に示されているように、 Windowsで起動されたPythonプログラムはcp1252、標準のエンコーディングとして使用されているようです。é0xe9cp1252
  • これは、この文字列をファイルに書き込むときにも明らかです(デフォルトでは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 に答える