python unicode:写入文件时,以不同的格式写入

时间:2015-09-05 12:23:32

标签: python python-3.x unicode utf-8 mojibake

我正在使用Python 3.4,将unicode字符串写入文件。 写完文件后,如果我打开并看到它,它就完全是一组不同的字符。

代码: -

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

with open('test.txt', 'w', encoding='utf-8') as f:
    name = 'أبيض'
    name.encode("utf-8")
    f.write(name)
    f.close()    

f = open('test.txt','r')
for line in f.readlines():
    print(line) 

输出: -

أبيض

提前致谢

1 个答案:

答案 0 :(得分:4)

您还需要指定读取时使用的编解码器:

f = open('test.txt','r', encoding='utf8')
for line in f.readlines():
    print(line) 

否则使用您的系统默认值;请参阅open() function documentation

  

encoding 是用于解码或编码文件的编码的名称。这应该只在文本模式下使用。默认编码取决于平台(无论locale.getpreferredencoding()返回什么),但可以使用Python支持的任何编码。

根据您获得的输出判断,您的系统使用Windows Codepage 1252作为默认值:

>>> 'أبيض'.encode('utf8').decode('cp1252')
'أبيض'

通过在阅读时使用错误的编解码器,您创建了所谓的Mojibake

请注意,写作示例中的name.encode('utf8')行完全是多余的;忽略该调用的返回值,并且f.write(name)调用负责实际编码。 f.close()调用也完全是多余的,因为with语句已经负责关闭文件。以下将产生正确的输出:

with open('test.txt', 'w', encoding='utf-8') as f:
    name = 'أبيض'
    f.write(name)

with open('test.txt', 'r', encoding='utf-8') as f:
    for line in f.readlines():
        print(line)