python-这些编码方法中哪一种是最可靠的?
作者:互联网
我对python很陌生,但是由于我的母语包括一些讨厌的变音符号,因此我不得不陷入噩梦,即编码一开始就正确.
我阅读了joelonsoftware关于编码的文字,并了解了代码点和字母的实际呈现方式之间的区别(以及unicode和编码之间的联系).
为了使我摆脱困境,我发现了三种处理变音符号的方法,但我无法决定,哪种方法适合哪种情况.
如果有人可以照亮它?我希望能够将文本写入文件,从中读取(或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
我必须在代码中的任何地方使用u’string'(unicode)吗?我发现,如果我只使用空白字符串(不带’u’),则变音符的替换是行不通的…
解决方法:
作为一般经验法则,您通常希望尽可能早地解码已编码的字符串,然后将其作为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进行检查);如果创建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字符串.
标签:encoding,diacritics,python 来源: https://codeday.me/bug/20191030/1969979.html