为什么网络服务器抱怨西里尔字母和命令行不?

时间:2014-09-30 05:22:39

标签: python unicode encoding

我有一个网络服务器,我试着提交一个包含西里尔文字母的表格。因此,我收到以下错误消息:

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

此消息来自以下代码行:

ups = 'rrr {0}'.format(body.replace("'","''"))

body包含西里尔字母)。奇怪的是我无法在python命令行中重现此错误消息。以下工作正常:

>>> body = 'ппп'
>>> ups = 'rrr {0}'.format(body.replace("'","''"))

1 个答案:

答案 0 :(得分:1)

它正在交互式提示中工作,因为您的终端正在使用您的区域设置来确定要使用的编码。直接来自Python docs

  

而python中的其他类文件对象总是转换为ASCII   除非你以不同的方式设置它们,使用print()输出到   终端将在发送之前使用用户的语言环境进行转换   输出到终端。

另一方面,当您的服务器运行脚本时,没有这样的假设。除非另有说明,否则从类文件对象读取的所有内容str都将在内存中编码为ASCII。您的西里尔字符(可能编码为UTF-8)无法转换;它们远远超出直接映射在UTF-8和ASCII之间的U + 007F代码点。 (Unicode使用十六进制来映射其代码点; U + 007F,然后是十进制的U + 00127。实际上,ASCII只有127个零索引代码点,因为它只使用1个字节,而在那个字节中,只有最低有效位7位。最高有效位始终为0.)

回到你的问题。如果要对文件正文进行操作,则必须指定应使用UTF-8编码打开它。 (再一次,我假设它是UTF-8,因为它是从网上提交的信息。如果它不是 - 那么,它确实应该是。)解决方案已经已在其他StackOverflow答案中给出,因此我just link to one of them而不是重申已经回答的问题。根据您的Python版本,最佳答案可能会有所不同 - 如果您在评论中告诉我,我可以给您更清​​晰的推荐。