1

Windows XP の簡体字中国語バージョンで Python 2.7.1 を使用しており、次のようなプログラム (windows_prn_utf8.py) を使用しています。

#!/usr/bin/env python
# -*- coding: utf8 -*-

print unicode('\xE7\x94\xB5', 'utf8')

Windows CMD コンソールで実行すると、正しい漢字 '电' が出力されます。ただし、コマンド出力をファイルにリダイレクトしようとすると。エラーが出ました。

D:\Temp>windows_prn_utf8.py > 1.txt
Traceback (most recent call last):
  File "D:\Temp\windows_prn_utf8.py", line 4, in <module>
    print unicode('\xE7\x94\xB5', 'utf8')
UnicodeEncodeError: 'ascii' codec can't encode character u'\u7535' in position 0: ordinal not in range(128)

ここにミッシングリンクがあることに気づきました。1.txt が生成された場合に備えて、1.txt の Unicode 文字を utf-8 または codepage-936 またはその他のエンコーディングでエンコードする必要があるかどうかを判断する方法が必要です。

次に、それを修正する方法は?私の好みは、 1.txt に utf-8 エンコーディングを含めることです。ありがとうございました。

ここに画像の説明を入力

4

4 に答える 4

3

これは解決されたようですが、もう少し詳しく説明すると、この実際の問題を説明するのに役立つと思います。

の「utf8」は、文字を内部的に Unicode オブジェクトとして表すために、他の引数で提供している 3 バイトをデコードunicode('\xE7\x94\xB5', 'utf8')する方法をインタープリターに指示しています。

In [6]: uobj = unicode('\xe7\x94\xb5','utf8')

In [7]: uobj
Out[7]: u'\u7535'

もう 1 つの例は、同じ文字を utf-16 表現から作成することです (これは Python がデフォルトで表示するもので、Out[7]上の行に示されています)。

In [8]: uobj = unicode('\x35\x75','utf16')

In [9]: uobj
Out[9]: u'\u7535'

オブジェクトが作成された後の例では、printそれを標準出力 (コンソール ウィンドウ、ファイルへのリダイレクトなど) に書き込もうとする引数になります。複雑なのは、printオブジェクトを書き込む前に、そのオブジェクトをバイトストリームに再エンコードする必要があることです。あなたの場合、デフォルトで使用されたエンコーディングは、その文字を表すことができない ACSII だったようです。

(コンソールが文字を表示しようとすると、それらは再デコードされ、ウィンドウ内で対応するフォントグリフに置き換えられます。これが、出力とコンソールの両方が同じエンコーディングで「話す」必要がある理由です。)

Windowsでcmd.exeを見たところ、文字エンコーディングに関してはかなり混乱していますが、他のOSで行っていることは、バイトを明示的にエンコードしてから、Unicodeオブジェクトのencode関数で印刷/書き込みすることです。strこれは、オブジェクトに格納されたエンコードされたバイト シーケンスを返します。

In [10]: sobj = uobj.encode('utf8')

In [11]: type(sobj)
Out[11]: str

In [12]: sobj
Out[12]: '\xe7\x94\xb5'

In [13]: print sobj
电

aの代わりに aprintが与えられたので、何もエンコードする必要はありません。私の場合、私の端末は utf8 をデコードしていて、そのフォントにはその特定の文字が含まれていたので、画面に正しく表示されました (そして、できれば今すぐブラウザーに表示されます)。strunicode

于 2016-01-07T18:53:03.990 に答える
1

open(filename) の代わりに codecs.open(filename,encoding) を使用し、python でファイルを書き込みます。

于 2013-07-29T08:12:35.540 に答える
1

PYTHONIOENCODING環境変数を設定します。

SET PYTHONIOENCODING=cp936
windows_prn_utf8.py > 1.txt
于 2013-07-29T08:01:42.673 に答える