了解Python Unicode和Linuxterminal

我有一个Python脚本,写入一些UTF-8编码的string。 在我的脚本中,我主要使用str()函数来强制转换为string。 看起来像这样:

 mystring="this is unicode string:"+japanesevalues[1] #japanesevalues is a list of unicode values, I am sure it is unicode print mystring 

我不使用Pythonterminal,只是标准的Linux Red Hat x86_64terminal。 我设置terminal输出utf8字符。

如果我执行这个:

 #python myscript.py this is unicode string: カラダーズ ソフィー 

但是,如果我这样做:

 #python myscript.py > output 

我得到了典型的错误:

 UnicodeEncodeError: 'ascii' codec can't encode characters in position 253-254: ordinal not in range(128) 

这是为什么?

Solutions Collecting From Web of "了解Python Unicode和Linuxterminal"

终端有一个字符集,Python知道那个字符集是什么,所以它会自动将你的Unicode字符串解码为终端使用的字节编码,在你的情况下是UTF-8。

但是当你重定向时,你不再使用终端。 你现在只是使用Unix管道。 Unix管道没有字符集,Python无法知道你现在想要的编码,所以它会回落到一个默认的字符集。 你已经用“Python-3.x”标记了你的问题,但是你的print语法是Python 2,所以我怀疑你实际上在使用Python 2.然后你的sys.getdefaultencoding()通常是'ascii' ,就你而言绝对如此。 当然,你不能将日文字符编码为ASCII,所以你会得到一个错误。

使用Python 2时最好的选择是在打印之前用UTF-8对字符串进行编码。 然后重定向将工作,并生成的文件是UTF-8。 这意味着,如果您的终端是其他的东西,它将无法正常工作,但是您可以从sys.stdout.encoding获取终端编码,并使用该编码(在Python 2下重定向时将为None)。

在Python 3中,除了需要更改print mystringprint(mystring) ,您的代码应该按原样运行。

如果输出到终端,那么Python可以检查$LANG的值来选择一个字符集。 如果您重定向,所有投注都将关闭。