3

编码问题的简单测试程序:

#!/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
4

3 回答 3

5

重定向输出时,sys.stdout未连接到终端,Python 无法确定输出编码。当定向输出时,Python 可以检测到这sys.stdout是一个 TTY,并在打印 unicode 时使用为该 TTY 配置的编解码器。

设置PYTHONIOENCODING环境变量以告诉 Python 在这种情况下使用什么编码,或者显式编码。

于 2013-07-02T15:59:19.713 回答
3

采用:print u"Råbjerg".encode('utf-8')

今天也问了类似的问题:Understanding Python Unicode and Linux terminal

于 2013-07-02T15:59:00.703 回答
2

我建议你输出它已经编码:

print u"Råbjerg".encode('utf-8')

这将在 utf-8 中写入字符串的正确字节,您将能够在几乎所有支持的编辑器/控制台中看到utf-8

于 2013-07-02T15:59:10.463 回答