我知道python文件的第一行总是提供编码信息。
但是我不知道第一行单词是用特定的编码编码的,编辑器怎么知道第一行单词的正确编码。
感谢您的回复
答案 0 :(得分:2)
这主要是一个漫游,因为Python中的编解码器处理有点混乱。
首先,编码行处理标准的python库codec
。这是一个奇怪的适配器模式:
getregentry()
和register()
函数,而不使用元数据。cpython/Python/codecs.c
(CPython源码),它比文档更准确。更具体地说,编码行由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