【问题标题】:python unicode: when written to file, writes in different formatpython unicode:写入文件时,以不同的格式写入
【发布时间】:2015-09-05 12:23:31
【问题描述】:

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

输出:-

أبيض

提前致谢

【问题讨论】:

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


    【解决方案1】:

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

    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) 
    

    【讨论】:

    • 工作得很好,谢谢,感谢您对实际发生的事情的精彩解释..
    • @remisharoon:以防万一您没有完全理解 Martijn 所说的关于代码中 name.encode("utf-8") 行的内容...该调用 修改 @987654335 @:它会创建一个新的字节字符串对象,其中包含 name 的 utf-8 编码版本,但是由于您没有将 name.encode("utf-8") 分配给任何新字符串,因此新字符串会被丢弃。
    猜你喜欢
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 2012-08-30
    • 2011-08-05
    • 1970-01-01
    • 2014-07-07
    相关资源
    最近更新 更多