python…使用linux时的编码问题>

发布于 2021-01-29 18:21:20

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

#!/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(挤压):

$ 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
被浏览
44
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看