1

誰もこれについて経験がありますか?

私はこの半年間、python 3.2 を使用してきましたが、2.6.2 の記憶はそれほど大きくありません。

私のコンピューターでは、2.6.1 を使用してテストされた次のコードが機能します。

import contextlib
import codecs

def readfile(path):
    with contextlib.closing( codecs.open( path, 'r', 'utf-8' )) as f:
        for line in f:
            yield line

path = '/path/to/norsk/verbs.txt'

for i in readfile(path):
    print i

しかし、電話では最初の特殊文字øに到達してスローします:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xf8' in position 3: ordinal not in range(128)

それらを入力するだけでなく、ファイルから読み取る必要があるので、何かアイデアはありますか?

4

2 に答える 2

2

印刷は I/O 操作です。I/O にはバイトが必要です。あなたが持っているのiはユニコード、または文字です。文字は、ASCII について話している場合にのみバイトに直接変換されますが、携帯電話では非 ASCII 文字 ( u'\xf8' は ø ) に遭遇しました。文字をバイトに変換するには、文字をエンコードする必要があります。

import contextlib
import codecs

def readfile(path):
    with contextlib.closing( codecs.open( path, 'r', 'utf-8' )) as f:
        for line in f:
            yield line

path = '/path/to/norsk/verbs.txt'

for i in readfile(path):
    print i.encode('utf8')

これがあなたのコードで機能する理由については、あるマシンでは機能し、他のマシンでは機能しないため、Python の自動検出がこれらのケースで異なるものを発見したに違いありません。各デバイスでこれを実行します。

$ python
>>> import sys
>>> sys.getfilesystemencoding()
'UTF-8'

一方に utf8 が表示され、もう一方に ascii が表示されると思います。これは、宛先が端末の場合に print が使用するものです。Python インストールのすべてのユーザー (おそらくあなただけ) が ascii よりも utf8 を好むと確信している場合は、Python インストールのデフォルトのエンコーディングを変更できます。

  1. あなたの site.py を見つけてください:python -c 'import site; print site
  2. それを開き、setencoding 関数を見つけます。

    def setencoding(): 
        """Set the string encoding used by the Unicode implementation.  The 
        default is 'ascii', but if you're willing to experiment, you can 
        change this.""" 
        encoding = "ascii" # Default value set by _PyUnicode_Init() 
    
  3. encoding = "ascii"行を次のように変更しますencoding = "UTF-8"

Just Work としてお楽しみください。このトピックの詳細については、http: //blog.ianbicking.org/illusive-setdefaultencoding.htmlを参照してください。

代わりに、python3 が提供するように、バイトと文字を厳密に分離したい場合は、 を設定できますencoding = "undefined"。このundefinedコーデックは、「すべての変換で例外を発生させます。バイト文字列と Unicode 文字列の間の自動変換が必要ない場合は、システム エンコーディングとして使用できます。

于 2012-07-12T16:16:26.527 に答える
0

Unicode文字列は自動的に印刷できないため、print関数は文字列を印刷可能な形式に変換する必要があります。reprでラップするprint repr(i)と印刷できますが、代わりにエンコードを指定することをお勧めします。

于 2012-07-12T16:18:08.857 に答える