当我在Python中使用open(文件名)或在C中使用fopen(文件名)时,保存文件的编码是什么?

当我在Python中使用open(文件名)或在C中使用fopen(文件名)时,保存文件的编码是什么?,python,encoding,python-2.7,file-encodings,Python,Encoding,Python 2.7,File Encodings,运行时环境:Python 2.7、Windows 7 注意:我说的是PYTHON源代码生成的文件的编码,不是PYTHON源文件的编码,PYTHON源文件顶部声明的编码与保存PYTHON源文件的编码一致 当stringcontent='abc'中没有非ascii字符时,filefile.txt(而不是PYTHON源文件)在fp.close之后以ANSI编码保存,PYTHON文件'和它以ANSI编码格式保存内容如下: ## Author: melo ## Email:prevision@imsrch

运行时环境:Python 2.7、Windows 7

注意:我说的是PYTHON源代码生成的文件的编码,不是PYTHON源文件的编码,PYTHON源文件顶部声明的编码与保存PYTHON源文件的编码一致

当stringcontent='abc'中没有非ascii字符时,filefile.txt(而不是PYTHON源文件)在fp.close之后以ANSI编码保存,PYTHON文件'和它以ANSI编码格式保存内容如下:

## Author: melo
## Email:prevision@imsrch.tk
## Date: 2012/10/12
import os

def write_file(filepath, mode, content):
    try:
        fp = open(filepath, mode)
        try:
            print 'file encoding:', fp.encoding
            print 'file mode:', fp.mode
            print 'file closed?', fp.closed
            fp.write(content)
        finally:
            fp.close()
            print 'file closed?', fp.closed
    except IOError, e:
        print e


if __name__ == '__main__':
    filepath = os.path.join(os.getcwd(), 'file.txt')
    content = 'abc'
    write_file(filepath, 'wb', content)
# -*- encoding: gbk -*-
## Author: melo
## Email:prevision@imsrch.tk
## Date: 2012/10/12
import os

def write_file(filepath, mode, content):
    try:
        fp = open(filepath, mode)
        try:
            print 'file encoding:', fp.encoding
            print 'file mode:', fp.mode
            print 'file closed?', fp.closed
            fp.write(content)
        finally:
            fp.close()
            print 'file closed?', fp.closed
    except IOError, e:
        print e

if __name__ == '__main__':
    filepath = os.path.join(os.getcwd(), 'file.txt')
    content = 'abc莹'
    write_file(filepath, 'wb', content)
但是当stringcontent='abc中有一些非ascii字符时莹', filefile.txt将在fp.close之后以UTF-8编码保存,尽管我在PYTHON源文件filenot file.txt的顶部声明了编码,并使用encoding=gbk。此时,PYTHON源文件的内容如下:

## Author: melo
## Email:prevision@imsrch.tk
## Date: 2012/10/12
import os

def write_file(filepath, mode, content):
    try:
        fp = open(filepath, mode)
        try:
            print 'file encoding:', fp.encoding
            print 'file mode:', fp.mode
            print 'file closed?', fp.closed
            fp.write(content)
        finally:
            fp.close()
            print 'file closed?', fp.closed
    except IOError, e:
        print e


if __name__ == '__main__':
    filepath = os.path.join(os.getcwd(), 'file.txt')
    content = 'abc'
    write_file(filepath, 'wb', content)
# -*- encoding: gbk -*-
## Author: melo
## Email:prevision@imsrch.tk
## Date: 2012/10/12
import os

def write_file(filepath, mode, content):
    try:
        fp = open(filepath, mode)
        try:
            print 'file encoding:', fp.encoding
            print 'file mode:', fp.mode
            print 'file closed?', fp.closed
            fp.write(content)
        finally:
            fp.close()
            print 'file closed?', fp.closed
    except IOError, e:
        print e

if __name__ == '__main__':
    filepath = os.path.join(os.getcwd(), 'file.txt')
    content = 'abc莹'
    write_file(filepath, 'wb', content)
有证据表明它的行为是这样的吗

# -*- encoding: gbk -*-
在PYTHON文件的顶部,指示PYTHON文件的编码。使用编解码器 使用模块


您需要这样做:

文件以您保存的编码保存。源文件以您保存它的编码方式保存。它们不一定是相同的,它们只是应该被声明

根据您的说明,我假设您使用的是记事本+,当您打开file.txt时,您会发现记事本++认为该文件是用UTF-8编码的,没有BOM表。这是记事本++的错误猜测。选择中文GB2312字符集,文件将正确显示

除非由字节顺序标记BOM或其他元数据给出提示或由用户告知,否则程序不知道文件的编码方式

正确的Python程序可以完成以下任务:

如果源文件中使用非ASCII字符,则声明源文件的编码。 对所有文本使用Unicode字符串。 当输出到二进制流(如文件)时,对Unicode字符串进行编码。 从二进制流读取时,将传入的文本数据解码为Unicode。 可选使用带有字节顺序标记的编码,以便编辑器了解文件编码。 例如:

# encoding: utf-8
import codecs
with codecs.open('file.txt','wb',encoding='utf-8-sig') as f:
    f.write(u'abc莹')
现在,您应该在Notepad++中看到file.txt被检测为编码为“UTF-8”的BOM,并正确显示该文件

请注意,如果将编码声明为GBK,则可以在系统上以“ANSI”GBK格式保存该文件,并且由于使用了Unicode字符串,因此该文件仍然有效


实际上,您的系统可能是代码页936 cp936,而不是GBK。它们并不完全相同。最好使用像UTF-8或UTF-16这样的Unicode编码,它可以准确地表示所有Unicode字符。

您为什么说它保存在UTF8中?@eakron file.txt在文件编码fp.close之后以UTF-8编码格式保存。我不确定我是否讲清楚了。注:事实是莹' 正确显示表示文件不是gbk格式,除非复制粘贴使用Unicode。u'\u83b9'Unicode字符为'\xd3\xa8',两个字节为gbk,'\xe8\x8e\xb9'三个字节为utf-8。试印reprcontent@J.F.Sebastian我说的是PYTHON源代码生成的文件的编码不是PYTHON源文件的编码,PYTHON源文件顶部声明的编码与保存PYTHON源文件的编码一致。。。字节。它包含的字节由Python源代码定义,因为您使用Python字符串文字来创建它。然后使用“wb”模式将这些字节按原样写入磁盘。因此file.txt文件编码由Python源文件编码定义。为了避免这种情况,请在脚本中使用Unicode字符串,并使用编解码器模块将这些字符串保存到具有所需编码的文件中。+1表示1-4,但5值得怀疑。相反,您可以使用理解编码声明的编辑器,或者只喜欢utf-8表示源代码编码。Python 3.5上的默认值是可选的,仅适用于具有意见:。file.txt没有编码声明。只有源文件可以。我希望全世界都能对所有文本文件使用UTF-8,但遗憾的是,事实并非如此。我为我蹩脚的英语感到抱歉,我已经仔细地重新编辑了我的问题,希望我已经说清楚了。编解码器之间的区别是什么。打开'file.txt','wb',encoding='UTF-8-sig'和编解码器。打开'file.txt','wb',encoding='utf-8'?它使用utf-8编码的字节顺序标记字符作为编码签名写入文件。读取时,utf-8-sig编解码器将自动检测并删除额外字符。在Windows上,语言环境编码的ANSI文件很常见,它可以帮助某些编辑器(如记事本)检测该文件是否为UTF-8。我知道该模块可以工作,但我只想弄清楚,如果不使用编解码器模块,为什么会出现这种情况。