3

我正在使用 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) 

输出:-

أبيض

提前致谢

4

1 回答 1

4

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

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

否则使用您的系统默认值;请参阅open()功能文档

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

从您得到的输出来看,您的系统默认使用Windows 代码页 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) 
于 2015-09-05T12:25:02.410 回答