Python编码声明似乎被忽略了?

Python编码声明似乎被忽略了?,python,character-encoding,Python,Character Encoding,以下代码保存为utf-8编码的文本文件: #!/usr/bin/env python # -*- coding: utf-8 -*- print 'é' 当我在Linux中使用Python2.7在命令行上运行上述代码时,我得到了预期的输出 如果我将文件中的编码声明从utf-8更改为cp1252并重新运行它,我将得到相同的输出é 但是Python现在不应该将文件中存储为hexc3a9的解释为cp1252编码文本吗?在这种情况下,输出应为é 如果我强制文本编辑器以cp1252编码文本的形式查看文

以下代码保存为utf-8编码的文本文件:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
print 'é'
当我在Linux中使用Python2.7在命令行上运行上述代码时,我得到了预期的输出

如果我将文件中的编码声明从utf-8更改为cp1252并重新运行它,我将得到相同的输出
é

但是Python现在不应该将文件中存储为hex
c3a9
解释为cp1252编码文本吗?在这种情况下,输出应为
é

如果我强制文本编辑器以cp1252编码文本的形式查看文件,则
é
将更改为
Ã
。为什么Python不这样做呢?

当我们声明
-*-编码:-*-
(或者只是
#编码:…
),我们告诉Python源文件以声明的编码保存。
因此,编码声明很重要,但是在源文件在声明的编码中有效并且我们不使用
u
-文本之前,更改声明的编码不会影响打印输出

要查看最后一句话,让我们看一下:


编码声明的效果。 一,。合成误差测试

首先,Python使用声明的编码进行
SyntaxError
测试。
例如,让我们运行保存在
utf-8
中的以下源文件:

# -*- coding: utf-8 -*-
print repr('Á') # '\xc3\x81'
如下所示:字符的
utf-8
字节为:
\xc3\x81

让我们更改声明的编码并再次运行该文件:

# -*- coding: cp1252 -*-
print repr('Á')
现在它失败了,错误如下:

SyntaxError: 'charmap' codec can't decode byte 0x81 in position 13: character maps to <undefined>
#-*-编码:cp1252-*-
打印报告('e')#'\xc3\xa9'
然后通过
sys.stdout.encoding

(大致如下例所示)

sys.stdout.encoding
取决于环境,而不取决于声明的编码。
这就是为什么当源文件采用相同的编码时,会得到相同的输出


二,。Unicode文本的解释

但是,编码声明会影响Python如何解释使用
u
-文本声明的unicode字符串:

# -*- coding: utf-8 -*-
print repr(u'é') # u'\xe9'
#-*-编码:cp1252-*-
打印报告(u'é')#u'\xc3\xa9'
在最后一个示例中,Python将
u'é
解释为
通过
cp1252
编码从
\xc3\xa9
字节解码的unicode字符串:

让我们打印这个unicode字符串:

print unicode('\xc3\xa9', 'cp1252') # é
因此,如果源文件位于
utf-8
中,并且声明的编码为
cp1252
,则可以使用
ee
的unicode文本获得

# -*- coding: cp1252 -*-
print u'é' # é

有关更多信息,请检查以下内容:

  • 我无法复制这一点。更改编码指令确实会更改程序的输出。但是,您忽略了设置中的一个未知项,即程序输出的解释和呈现方式。也许这会有帮助…非常详细和信息丰富的答案。事实上,我把你给出的所有例子都打了出来,这确实有助于我理解这个主题。干得好:)
    print repr(unicode('\xc3\xa9', 'cp1252')) # u'\xc3\xa9'
    
    print unicode('\xc3\xa9', 'cp1252') # é
    
    # -*- coding: cp1252 -*-
    print u'é' # é