2011-12-14 2 views
2

subprocess.check_output MS DOSコマンドラインアプリケーションの呼び出しを使用して、stdout文字列をアプリケーションから返します。Pythonのsubprocess.check_output(±)文字付き

check_outputからの戻り値は、実行されたコマンドに関する情報です。新しい行には、後にある結果と新しい行が含まれています。具体的に返される文字列は次のようになります。

b'0ms: Channel.#0.Range.SelectedItem?\r\n\xf150 mV\r\n' 

問題はその文字が±(\ XB1)であることを意味する、最初の改行の後の\ XF1であるが、常にñとして返されます(\ XF1)となぜ私はうまくいかない。

私がコマンドラインで手動でコマンドを実行すると、予想通り±が得られるので、コマンドラインアプリケーションに問題がないとは思わない。

短期間に私は\ xf1で見つけた\ xf1を置き換えることができますが、そのハックはそれを回避するよりもむしろ防ぐことを好みます。

誰でも、コマンドラインとPythonの文字の違いは何ですか?

答えて

1

おそらくあなたが実行しているプログラムは、あなたのpythonスクリプトで使用しているものとは別のエンコーディングを出力します。私が正しい場合、どのエンコードであるかを調べるには、.decode(<origin-encoding>).encode(<target-encoding>)メソッドを使用して処理を回避できます。

編集:私が候補エンコーディングを見つけたようだ:これはそれこと、およびことかもしれないだけであること、それはすべての可能な出力のための正しいものであることを保証しないことを

>>> print s.decode('cp850') 
0ms: Channel.#0.Range.SelectedItem? 
±50 mV 

注意私はコーデックで浮気している間、jsbuenoが同じ結論に達しましたが、なぜこのコーデックのように「歴史観」を持つ:それは±文字...

EDIT2のために働きます使用する必要があるかもしれません...

HTH!

+0

はい、CP850は、トリックを行い、私は使用していなかったました正しいエンコーディング – Trevor

2

MS DOSアプリケーションでは、Windowsラテン語(cp1252)や文明世界(web + unix:utf-8)とは異なる文字エンコードが使用されます(下位互換性のため、CP850コードページを使用します)。

あなたが同じように、この文字列から適切なPythonのUnicodeはCP850のエンコーディングでそれをデコードすることである持ってしなければならないすべて:

>>> print '0ms: Channel.#0.Range.SelectedItem?\r\n\xf150 mV\r\n'.decode("cp850") 
0ms: Channel.#0.Range.SelectedItem? 
±50 mV 
+0

それは私が探していたエンコーディングです、私はデコードでそれらの束を試してみましたが、実際には働いていませんでした。 – Trevor

関連する問題