哪种编码方法最可靠?

时间:2013-07-01 15:06:41

标签: python encoding diacritics

我对python很新,但由于我的母语包括一些令人讨厌的变音符号,我不得不深入研究编码在开始时的噩梦。 我阅读了joelonsoftware关于编码的文本,并理解了代码点和字母的实际渲染(以及unicode和编码之间的连接)之间的区别。 为了让我摆脱困境,我找到了3种处理变音符号的方法,但我无法决定,哪种方式适合某些情况。 如果有人可以点亮它?我希望能够将文本写入文件,从中读取(或sqlite3)并发出文本,包括可读的变音符号...... 非常感谢!

# -*- coding: utf-8 -*-
import codecs

# using just u + string
with open("testutf8.txt", "w") as f:
    f.write(u"Österreichs Kapitän")

with open("testutf8.txt", "r") as f:
    print f.read()


# using encode/decode
s = u'Österreichs Kapitän'
sutf8 = s.encode('UTF-8')
with open('encode_utf-8.txt', 'w') as f2:
    f2.write(sutf8)
with open('encode_utf-8.txt','r') as f2:
    print f2.read().decode('UTF-8')


# using codec
with codecs.open("testcodec.txt", "w","utf-8") as f3:
    f3.write(u"Österreichs Kapitän")

with codecs.open("testcodec.txt", "r","utf-8") as f3:
    print f3.read() 

编辑: 我测试了这个(文件内容是'ÖsterreichsKapitän'):

with codecs.open("testcodec.txt", "r","utf-8") as f3:

    s= f3.read()
    print s
    s= s.replace(u"ä",u"ü")
    print s

我的代码中是否必须使用ustring'(unicode)?我发现,如果我只使用空白字符串(没有'你'),替换变音符号不起作用......

1 个答案:

答案 0 :(得分:4)

作为一般经验法则,您通常希望尽早解码编码字符串,然后将其作为unicode对象进行操作,最后尽可能晚地对其进行编码(例如,在将其写入文件之前)。

所以例如:

with codecs.open("testcodec.txt", "r","utf-8") as f3:
    s = f3.read()

# modify s here

with codecs.open("testcodec.txt", "w","utf-8") as f3:
    f3.write(s)

关于你的问题,哪种方式最好:我不认为使用编解码器库或手动使用编码/解码之间存在差异。这是一个偏好的问题,要么有效。

简单地使用open,就像在你的第一个例子中一样,不起作用,因为python将尝试使用默认编解码器(如果你没有改变它,就是ASCII)对字符串进行编码。

关于是否应该在任何地方使用unicode字符串的问题: 原则上,是的。如果您创建字符串s = 'asdf',则其类型为str(您可以使用type(s)进行检查),如果您执行s2 = u'asdf',则其类型为unicode。 因为总是操纵unicode对象会更好,所以建议使用后者。

如果您不想总是在字符串前面添加“u”,可以使用以下导入:

from __future__ import unicode_literals

然后你可以s = 'asdf',而s会有unicode类型。在Python3中,这是默认值,因此仅在Python2中需要导入。

对于潜在的陷阱,你可以看看Any gotchas using unicode_literals in Python 2.6?。基本上你不想混合使用utf-8编码的字符串和unicode字符串。