我对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)?我发现,如果我只使用空白字符串(没有'你'),替换变音符号不起作用......
答案 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字符串。