为什么我在使用python解释器时不需要声明编码?

时间:2015-08-03 08:33:50

标签: python character-encoding

# -*- coding: utf-8 -*-

据我所知,当python脚本文件中涉及非ascii字符时,这行代码是必需的。

当我学习python时,我被告知运行python代码的两种方式(在解释器中逐行运行并运行脚本文件)将产生相同的结果。在大多数情况下,他们确实这样做了。但是当脚本中涉及非ascii字符时,事实证明我必须首先声明编码。

此外,我尝试过exec()函数,尝试执行包含python代码的字符串。

>>> exec ("b='你'")

它有效。

但是如果我将“b ='你'”保存到脚本并运行它,我将会出现语法错误。

我很好奇为什么在解释器中逐行运行python代码时不需要声明编码。

这两种方式的执行程序有什么不同吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

因为标准已经有编码(sys.stdin.encoding)。

stdin的编码可能来自各种来源,具体取决于平台。在Apple和Windows上预定义(Apple的"utf-8"和Windows的"mbcs",否则由LC_ALLLANG给出的当前区域设置确定(如果{{1}缺少)环境变量。

如果你在linux下运行,你可以运行LC_ALL,你的例子应该会失败。

答案 1 :(得分:0)

我认为Python的交互式会话使用system encoding(另请参阅Python Unicode strings and the Python interactive interpreter)。

当它读取源文件时,它需要知道如何解释它正在解析的数据 没有必要用与执行它的终端相同的编码来编写脚本是合乎逻辑的;在没有指定编码的环境的情况下运行脚本时甚至更多。

此外,有趣的是阅读 Joel Spolsky The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets这可能解释为什么Python选择要求开发人员明确编码(我希望他们设置一个默认为UTF8,但他们的方式与Zen of Python)保持一致。