7

このような質問が以前に出されたことは承知しています。しかし、私は解決策を見つけていません。

私のpythonファイルで定義されたunicodeリテラルをsubprocessモジュールで使用したいと考えています。しかし、必要な結果が得られません。たとえば、次のコード

# -*- coding: utf-8 -*-
import sys
import codecs
import subprocess
cmd = ['echo', u'你好']
new_cmd = []
for c in cmd:
    if isinstance(c,unicode):
        c = c.encode('utf-8')
    new_cmd.append(c)
subprocess.call(new_cmd)

プリントアウト

你好

コードを次のように変更すると

# -*- coding: utf-8 -*-
import sys
import codecs
import subprocess
cmd = ['echo', u'你好']
new_cmd = []
for c in cmd:
    if isinstance(c,unicode):
        c = c.encode(sys.getfilesystemencoding())
    new_cmd.append(c)
subprocess.call(new_cmd)

私は次のことを得る

??

この段階では、単純な間違いを繰り返しているとしか思えません。しかし、それが何であるかを理解するのに苦労しています。Pythonのサブプロセスを介して呼び出されたときに、echoに次のように出力させるにはどうすればよいですか

你好

編集:

Python のバージョンは 2.7 です。Windows 8 で実行していますが、ソリューションをプラットフォームに依存しないようにしたいと考えています。

4

2 に答える 2

2

あなたの最初の試みは最高でした。

実際に 2 つの Unicode 文字u'你好'(またはu'\u4f60\u597d') を UTF8に変換すると、 b'\xe4\xbd\xa0\xe5\xa5\xbd'.

Unicode を完全にサポートする IDLE で制御できb'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('utf-8')ます你好。それを制御する別の方法は、スクリプト出力をファイルにリダイレクトし、UTF-8 互換エディターで開くことです。ここでも、必要なものが表示されます。

しかし問題は、Windows コンソールが完全な Unicode をサポートしていないことです。による :

  • インストールされたコード ページ - Windows 8 についてはわかりませんが、以前のバージョンでは Unicode のサポートが不十分で、256 文字しか表示できませんでした
  • コンソールで使用されるフォント - すべてのフォントにすべての文字のグリフがあるわけではありません。

文字のグリフを含むコード ページを知っている場合 (私は知りません)、それをコンソールに挿入して、chcpUnicode 文字列を明示的にエンコードすることができます。しかし、私のフランスのマシンでは、どうすればいいのかわかりません...テキストファイルを渡す以外は!

あなたがConEmuについて話したように、私はそれを試してみました...そして、Python 3.4でうまく動作します!

chcp 65001
py -3
import subprocess
cmd = ['cmd', '/c', 'echo', u'\u4f60\u597d']
subprocess.call(cmd)

与える:

你好  
0

問題はcmd.exe窓だけです!

于 2015-05-05T15:11:16.293 に答える
1

結論:文字エンコーディングに注意してください (ここには 3 つの異なる文字エンコーディングがあります)。移植可能な Unicode サポートが必要な場合 (引数を Unicode として渡し、エンコードしない)、Python 3 を使用するか、環境からの現在の文字エンコーディングを使用してデータを表現できることを確認します ( sys.getfilesystemencoding()2 番目のコードで行うように、Python 2 を使用してエンコードします)。例)。


最初のコード例は正しくありません。py -3 -midlelib効果は (IDLE で実行 -- )と同じです。

>>> print(u'你好'.encode('utf-8').decode('mbcs')) #XXX DON'T DO IT!
你好

ここでmbcscodec はWindows ANSI コード ページを使用します(通常:文字エンコーディング -- たとえばロシア語 Windows ではcp1252異なる場合があります)。cp1251

Python 2 は、CreateProcessマクロを使用して、CreateProcessAそこで機能するサブプロセスを開始します。CreateProcessA Windows ANSIエンコーディングを使用してエンコードされているものとして入力バイトを解釈します。Python ソース コードのエンコーディング (この場合は utf-8)とは無関係です。

間違ったエンコーディングを使用すると、文字化けが発生することが予想されます。


2 番目のコード例は、cp1252(Unicode からバイトへのエンコードを有効にする)などの Windows コード ページを使用して入力文字を表すことができ、 echoUnicode API を使用して Windows コンソールに出力する場合 ( PythonWriteConsoleW() 3 パッケージを参照してください。 chcp (「OEM」) は、コンソールのフォントが文字をサポートしている限り) 、または(実行して自分のものを見つける) などのOEM コード ページ (で使用) を使用して文字を表すことができます。疑問符は、コンソールのエンコーディングを使用して表現できないことを示します。win-unicode-consoleprint(u'你好') cmd.execp437chcp??你好

任意の Unicode 引数 (Windows ("ANSI") または MS-DOS (OEM) コード ページを使用して表現できない文字を含む) をサポートするには、CreateProcessW関数 (Python 3 で使用される) が必要です。Python と subprocess.Popen() を使用した Windows での Unicode ファイル名を参照してください。

于 2015-05-06T16:31:03.903 に答える