打印是一种 I/O 操作。I/O 需要字节。您拥有的i
是 unicode 或字符。当我们谈论 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 安装的所有用户(很可能只有你)更喜欢 utf8 而不是 ascii,你可以更改 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 字符串之间的自动强制转换,则可以用作系统编码。 ”