3

Pythonで書かれたxmppボットがあります。そのプラグインの 1 つは、OS コマンドを実行し、ユーザーに出力を送信できます。私が知る限り、出力は xmpp プロトコルで送信するために Unicode に似ている必要があります。だから私はそれをこのように処理しようとしました:

output = os.popen(cmd).read() 
if not isinstance(output, unicode):
   output = unicode(output,'utf-8','ignore')
bot.send(xmpp.Message(mess.getFrom(),output))

しかし、ロシア語の記号が出力に現れると、うまく変換されません。

sys.getdefaultencoding() 

デフォルトのコマンドプロンプトエンコーディングは「ascii」であると言われていますが、やろうとすると

output.decode('ascii') 

pythonコンソールで私は得る

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0x92 in position 1: 
ordinal not in range(128)

OS: Win XP、Python 2.5.4 PS: 私の英語でごめんなさい :(

4

4 に答える 4

3

sys.getdefaultencoding()Python のデフォルトのエンコーディングを返します。これは、変更していなければ ASCII です。ASCII はロシア語の文字をサポートしていません。

手動で、またはlocale モジュールを使用して、実際のテキストがどのエンコーディングであるかを調べる必要があります。

通常、次のようなものです。

import locale
encoding = locale.getpreferredencoding(do_setlocale=True)¶
于 2010-02-14T21:38:07.157 に答える
2

Ascii には、127 0x7F を超える文字値が定義されていません。おそらく、キリル文字のコードページのことでしょうか? 866です

http://en.wikipedia.org/wiki/Code_pageを参照

編集:この回答は正しいとマークされたため、おそらく886が機能しましたが、他の回答が指摘しているように、ロシア語のコードページは886だけではありません。ロシア語の記号がエンコードされたときに使用されたものとは異なるコード ページを使用すると、間違った結果が得られます。

于 2010-02-14T21:35:57.003 に答える
1

"""sys.getdefaultencoding() は、デフォルトのコマンド プロンプト エンコーディングが 'ascii' であると言っています"""

sys.getdefaultencoding は、「コマンド プロンプト」エンコーディングについて何も言いません。

Windows ではsys.stdout.encoding、ジョブを実行する必要があります。私のマシンではcp850、Python がコマンド プロンプト ウィンドウとcp1252IDLE で実行されている場合が含まれます。あなたのものには、それぞれ と が含まれている必要がcp866ありcp1251ます。

更新IDLEではまだcp866が必要だとおっしゃっています。これに注意してください:

IDLE 2.6.4      
>>> import os
>>> os.popen('chcp').read()
'Active code page: 850\n'
>>>

そのため、アプリの起動時に、Windows を使用しているかどうかを確認し、Windows を使用している場合は の結果を解析しos.popen('chcp').read()ます。の前のテキスト:は、おそらくロケール依存です。codepage = result.split()[-1]「解析」で十分かもしれません。Windows/MS-DOS の分割されたパーソナリティーを持たない Unix では問題ないsys.stdout.encodingはずです。

于 2010-02-15T00:28:40.707 に答える
0

Python の 'cp855'、'cp866'、'cp1251'、'iso8859_5'、'koi8_r' は異なるロシア語のコード ページです。popen の出力をデコードするには、正しいものを使用する必要があります。Windows コンソールで「chcp」コマンドを実行すると、コンソール コマンドで使用されるコード ページが一覧表示されます。これは必ずしも Windows アプリケーションと同じコード ページではありません。米国の Windows では、「cp437」はコンソールに使用され、「cp1252」はメモ帳などのアプリケーションに使用されます。

于 2010-02-14T22:48:51.577 に答える