我只是想在这里提一些我必须花很长时间试验的东西,然后我才最终意识到发生了什么。这对这里的每个人来说可能都很明显,以至于他们都懒得提它。但如果他们有的话,它会帮助我,所以按照这个原则......!
注意:我正在使用Jython,v 2.7,所以这可能不适用于CPython ...
NB2:我的 .py 文件的前两行是:
# -*- coding: utf-8 -*-
from __future__ import print_function
“%”(又名“插值运算符”)字符串构造机制也会导致其他问题......如果“环境”的默认编码是 ASCII 并且您尝试执行类似的操作
print( "bonjour, %s" % "fréd" ) # Call this "print A"
您在 Eclipse 中运行不会有任何困难...在 Windows CLI(DOS 窗口)中,您会发现编码是代码页 850(我的 Windows 7 操作系统)或类似的东西,它至少可以处理欧洲重音字符,所以它会工作的。
print( u"bonjour, %s" % "fréd" ) # Call this "print B"
也将工作。
如果,OTOH,您从 CLI 定向到文件,则标准输出编码将为无,默认为 ASCII(无论如何在我的操作系统上),它将无法处理上述任何一种打印...(可怕的编码错误)。
那么你可能会考虑通过使用重定向你的标准输出
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
并尝试在 CLI 管道中运行到文件...很奇怪,上面的 print A 可以工作...但是上面的 print B 会抛出编码错误!但是,以下将正常工作:
print( u"bonjour, " + "fréd" ) # Call this "print C"
我得出的结论(暂时)是,如果将使用“u”前缀指定为Unicode字符串的字符串提交给 %-handling 机制,它似乎涉及使用默认环境编码,而不管您是否已将标准输出设置为重定向!
人们如何处理这是一个选择问题。我会欢迎 Unicode 专家说出为什么会发生这种情况,我是否在某些方面弄错了,对此的首选解决方案是什么,它是否也适用于CPython,是否发生在 Python 3 中等等,等等。