在Linux上发生了UnicodeEncodeError错误,但在Windows上没有发生。
在Linux上发生了UnicodeEncodeError错误,但在Windows上没有发生。
在Linux上尝试打印一个Unicode字符串时,我遇到了一个UnicodeEncodeError: \'ascii\' codec can\'t encode
的异常。在Windows上,我没有遇到这个错误。\n在Linux上执行的代码:\n
my_str = u'\u4ece\u5165\u5e93' print "%r" % my_str #输出:u'\u4ece\u5165\u5e93' print "%s" % my_str #输出:UnicodeEncodeError: 'ascii' codec can't encode character u'\u4ece' in position 0: ordinal not in range(128)
\n在Windows上,我得到的结果是:\n
my_str = u'\u4ece\u5165\u5e93' print "%r" % my_str #输出:u'\u4ece\u5165\u5e93' print "%s" % my_str #输出:从入库
在Linux上出现UnicodeEncodeError错误,但在Windows上没有出现的原因是由于Linux和Windows的默认字符编码不同。解决方法是使用适当的编码方式来处理输出。
解决方法之一是使用`.format()`函数来格式化字符串,并将字符串转换为Unicode编码。可以尝试以下代码:
print u"{0}".format(str)
另一种解决方法是使用`.decode()`函数将字符串解码为Unicode编码,并使用`print`语句输出。可以尝试以下代码:
print u"{0}".format(l.decode('utf-8'))
这个问题不是因为插入的值如何转换的问题,因为它实际上没有进行转换。`bytestr % (unicodestring,)`会自动对字节串进行解码,这对于只包含ASCII字符的`"%s"`对于该问题的提问者来说是可行的。然而,问题的提问者遇到了一个编码异常,因为`print`语句需要将生成的Unicode值编码为`sys.stdout.encoding`。
因此,通过使用适当的编码方式,可以解决Linux上的UnicodeEncodeError错误。
在Linux中出现UnicodeEncodeError错误但在Windows中没有的问题,很可能是由于您的locale和/或环境损坏、未安装、未设置或设置为C。Python使用locale设置来在stdout上应用正确的编码器,以便将Unicode编码为适当的编码。
如果您从命令行运行Python,请确保您的locale设置正确。输入locale命令,您应该看到类似以下内容的输出:
$ locale LANG=en_GB.UTF-8 LANGUAGE= LC_CTYPE="en_GB.UTF-8" LC_NUMERIC="en_GB.UTF-8" LC_TIME="en_GB.UTF-8" LC_COLLATE="en_GB.UTF-8" LC_MONETARY="en_GB.UTF-8" LC_MESSAGES="en_GB.UTF-8" LC_PAPER="en_GB.UTF-8" LC_NAME="en_GB.UTF-8" LC_ADDRESS="en_GB.UTF-8" LC_TELEPHONE="en_GB.UTF-8" LC_MEASUREMENT="en_GB.UTF-8" LC_IDENTIFICATION="en_GB.UTF-8" LC_ALL= $
如果您看到错误消息或LANG=C或类似的输出,Python将使用ASCII编码器,该编码器会拒绝非ASCII字符。
要查找系统上安装的locale,请输入locale -a命令。选择适当的locale,最好是以"UTF-8"结尾的locale,并相应地设置LANG。例如:
LANG=en_GB.UTF-8
然后再次运行locale命令并检查是否有错误。如果仍然出现错误,您需要研究如何重建适用于您的发行版的locale。
如果您在IDE中运行或无法修复问题,您可以尝试将以下环境变量添加到您的shell或IDE运行配置中:
export PYTHONIOENCODING=utf-8
这告诉Python忽略locale并将UTF-8编码器应用于stdout。
您可以使用Python中的locale模块验证Python使用的locale。健康的locale返回:
>>> import locale >>> locale.getdefaultlocale() ('en_GB', 'UTF-8') >>> locale.getpreferredencoding() 'UTF-8'
不健康的locale会将locale.getpreferredencoding()返回为US-ASCII。
您的locale是错误的。它应该是UTF-8,并与locale -a中的定义匹配。请执行以下操作:export LANG=en_US.UTF-8,然后运行locale命令以进行验证。
在这种情况下,OP几乎肯定使用了管道,因此没有终端,Python默认为ASCII。
抱歉,我不知道"data"代表什么。我发现当我在Linux系统上打印"你好"时,它可以正常工作,但是打印u"你好"会出错。
关键不是正确打印,而是错误的出现。这是因为一个是编码后的字节,另一个是Unicode。请查看nedbatchelder.com/text/unipain.html了解更多关于它们之间区别的信息。
这是正确的答案,我一直在为这个问题苦苦挣扎,问题出在locale设置上。