编辑器如何知道python文件的编码?

时间:2020-09-27 09:21:00

标签: python

我知道python文件的第一行总是提供编码信息。

但是我不知道第一行单词是用特定的编码编码的,编辑器怎么知道第一行单词的正确编码。

感谢您的回复

4 个答案:

答案 0 :(得分:2)

这主要是一个漫游,因为Python中的编解码器处理有点混乱。

首先,编码行处理标准的python库codec。这是一个奇怪的适配器模式:

  • 识别各种名为“ utf- *”的编解码器的奇怪并发症
  • “流”与“增量”与基本编码/解码器的概念
  • 显式使用getregentry()register()函数,而不使用元数据。
  • 可怜的文档,以及许多实现上的技巧。
  • 您可以先查看cpython/Python/codecs.c(CPython源码),它比文档更准确。
  • 这是您可能会发现CPython,Jupyter Python,Pipi和其他实现之间不兼容的地方。
  • 这里有龙

更具体地说,编码行由PEP 263定义。由于字符都比较低,因此应该使用诸如UTF-8,iso-8559-1等结尾的字符。有点像旧的Hayes调制解调器代码“ AT”,这是两个字母,不管奇偶校验和字节大小设置如何,都可以正常工作。其他最常见的编码是具有BOM的UTF-16和变体。

您可能还会看到cpython/Parser/tokenizer.c:check_coding_spec()cpython/Parser/pegen.c:1172正在呼叫PyTokenizer_FromFile()等。这有点麻烦,在完成之前,您将对Python的标记器有太多了解。

简短的答案:Python最初以字节为单位打开文件;在离开令牌生成器之前是UTF-8,令牌生成器检查BOM (Byte Order Mark)并使用编解码器处理器进行一些魔术操作以读取编码行,然后使用编码行。杂乱无章,但可以满足人们的要求。

我希望这能回答您的问题。

答案 1 :(得分:1)

每个编辑器都有自己的内置算法,这些算法取决于字节码,有时还取决于文件扩展名来确定编码。对于大多数文件扩展名,如果编辑器无法确定编码,则它会退回到通用编码,对于文本文件,该编码通常为UTF-8,因为它支持更多的符号集并被广泛使用。

例如,Python本身。在Python 2时代,源代码的默认/后备编码为ASCII。因此,您提到编码的前几行应为Python2处理它的有效ASCII。在Python 3中,此选项已切换为UTF-8。因此,python解释器会将前几行解释为有效的UTF-8,然后使用您提供的任何自定义编码覆盖它。

答案 2 :(得分:0)

除了相信文件的编码然后尝试对其进行解码之外,我不认为知道文件的编码有任何完全可靠的方法。

例如,编辑器可能假定使用UTF-8编码,这是一种非常通用的编码,能够编码任何Unicode字符。如果文件解码没有错误,则无需执行其他任何操作。否则,我确信编辑器会尝试其他某些编码,直到成功并产生没有解码错误或最终放弃的东西。对于能够理解内容的编辑器,即使文件解码没有错误,编辑器可能也会另外检查内容是否代表文件类型所隐含的内容。

答案 3 :(得分:-1)

我不确定我是否理解您的问题。但是,所有IDE都具有默认编码,对于所有Python IDE而言,默认编码均为UTF-8。首先,它检查代码点是小于128还是大于128。由此可以了解每个字符是否使用一个或多个字节。 (因此是UTF-8,UTF-16等)。

默认编码为UTF-8的另一个原因是UTF-8可以处理任何Unicode代码点。

您可以在此处找到更多信息:https://docs.python.org/3/howto/unicode.html