编码问题的简单测试程序:
#!/bin/env python
# -*- coding: utf-8 -*-
print u"Råbjerg" # >>> unicodedata.name(u"å") = 'LATIN SMALL LETTER A WITH RING ABOVE'
这是我从debian命令框中使用它时得到的,我不明白为什么在这里使用重定向打破了这个东西,因为我可以在没有使用时正确看到它。
有人可以帮助理解我错过的内容吗?什么应该以正确的方式打印这些角色,以便它们在任何地方都可以使用?
$ python testu.py
Råbjerg
$ python testu.py > A
Traceback (most recent call last):
File "testu.py", line 3, in <module>
print u"Råbjerg"
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe5' in position 1: ordinal not in range(128)
使用debian Debian GNU / Linux 6.0.7(squeeze)配置:
$ locale
LANG=fr_FR.UTF-8
LANGUAGE=
LC_CTYPE="fr_FR.UTF-8"
LC_NUMERIC="fr_FR.UTF-8"
LC_TIME="fr_FR.UTF-8"
LC_COLLATE="fr_FR.UTF-8"
LC_MONETARY="fr_FR.UTF-8"
LC_MESSAGES="fr_FR.UTF-8"
LC_PAPER="fr_FR.UTF-8"
LC_NAME="fr_FR.UTF-8"
LC_ADDRESS="fr_FR.UTF-8"
LC_TELEPHONE="fr_FR.UTF-8"
LC_MEASUREMENT="fr_FR.UTF-8"
LC_IDENTIFICATION="fr_FR.UTF-8"
LC_ALL=
编辑:从后面的指点中看到的其他类似问题
#!/bin/env python1
# -*- coding: utf-8 -*-
import sys, locale
s = u"Råbjerg" # >>> unicodedata.name(u"å") = 'LATIN SMALL LETTER A WITH RING ABOVE'
if sys.stdout.encoding is None: # if it is a pipe, seems python2 return None
s = s.encode(locale.getpreferredencoding())
print s
答案 0 :(得分:5)
重定向输出时,sys.stdout
未连接到终端,Python无法确定输出编码。当不指示输出时,Python可以检测到sys.stdout
是TTY,并且在打印unicode时将使用为该TTY配置的编解码器。
设置PYTHONIOENCODING
environment variable告诉Python在这种情况下使用什么编码,或明确编码。
答案 1 :(得分:3)
使用:print u"Råbjerg".encode('utf-8')
答案 2 :(得分:2)
我建议您输出已经编码的内容:
print u"Råbjerg".encode('utf-8')
这将在utf-8中写出字符串的正确字节,您几乎可以在每个支持utf-8