印刷は 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 インストールのデフォルトのエンコーディングを変更できます。
- あなたの site.py を見つけてください:
python -c 'import site; print site
それを開き、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()
encoding = "ascii"
行を次のように変更しますencoding = "UTF-8"
Just Work としてお楽しみください。このトピックの詳細については、http: //blog.ianbicking.org/illusive-setdefaultencoding.htmlを参照してください。
代わりに、python3 が提供するように、バイトと文字を厳密に分離したい場合は、 を設定できますencoding = "undefined"
。このundefined
コーデックは、「すべての変換で例外を発生させます。バイト文字列と Unicode 文字列の間の自動変換が必要ない場合は、システム エンコーディングとして使用できます。」