在Linux上发生了UnicodeEncodeError错误,但在Windows上没有发生。

9 浏览
0 Comments

在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 #输出:从入库

0
0 Comments

在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错误。

0
0 Comments

在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设置上。

0