2

いくつかの文字列を (stdout に) 出力する必要があります。Windows コンソールは cp437 で動作するため、文字列に cp437 以外の文字が含まれていると、例外がスローされます。

私はこれを回避しました

encoding=sys.stdout.encoding
pathstr = path.encode(encoding,errors="replace").decode(encoding)
print(pathstr)

出力したいpathのはどこですか。str文字を「?」に置き換えても問題ありません。

これは、バイト配列に変換されてから str に戻されるため、良くないようです。

これを達成するためのより良い方法はありますか?

私はまだPythonを使い始めたばかりです(おそらく1週間)、cpython 3.3でWin7 32ビットを使用しています

4

3 に答える 3

3

これは、バイト配列に変換されて str に戻されるため、良くないようです。

生のバイトをストリームに書き込みたい場合は、次を使用します.buffer

pathbytes= path.encode(encoding, errors= 'replace')
sys.stdout.buffer.write(pathbytes)

...問題 1602が発生し、Windows コマンド プロンプトの Unicode の恐ろしさを回避できる日のために...

于 2013-04-29T01:20:35.823 に答える
1

文字を「?」に置き換えても問題ありません。

PYTHONIOENCODING 環境変数を設定できます。

C:\> set PYTHONIOENCODING=cp437:replace

Unicode 文字列を直接出力します。

print(path)

その場合、ファイルにリダイレクトしている場合。PYTHONIOENCODING を utf-8 に設定すると、正しい完全な出力が得られます。

また、対応する Python バグのWriteConsoleW()ベースのソリューションを試して、Python 3.3 で動作するかどうかを確認することもできます。

import _win_console
_win_console.install_unicode_console()

print("cyrillic: цык.")

どこ_win_consoleからwin_console.patchですか。この場合、環境変数を設定する必要はなく、任意のコードページで動作するはずです (適切なコンソール フォントを使用すると、現在のコードページ以外の文字が表示される場合もあります)

Windows コンソール内で Unicode を印刷する問題のすべての解決策には欠点があります(詳細については、バグ トラッカーの議論と参照リンクを参照してください)

于 2013-04-29T03:46:16.087 に答える
0

Unicode について私がこれまでに聞いた最高のアドバイスは、Unicode サンドイッチを作ることでした。

  1. プログラム内の受信テキストをすぐに Unicode に変換します。
  2. プログラムで Unicode のみを扱います。
  3. 出力に必要なシリアル化形式にエクスポートします。

この場合、基本的にそれを行っています。より長いプログラムでは、あなたが説明した方法でこれを行うのが理にかなっており、より快適に感じると思います。

私が行う唯一の変更は、utf-8 にエンコードしてから、出力時に cp437 にデコードすることです。

于 2013-04-27T23:27:56.937 に答える