Python 哪种编码方法最可靠?
我对python相当陌生,但由于我的母语包含一些讨厌的UMLAUT,我不得不陷入一场噩梦:编码一开始就是正确的。 我阅读了joelonsoftware的编码文本,了解了代码点和字母的实际呈现之间的区别(以及unicode和编码之间的联系)。 为了让我摆脱困境,我找到了3种处理UMLAUT的方法,但我无法决定哪种方法适合什么情况。 如果有人能给它点颜色看看?我希望能够将文本写入文件,从中读取(或sqlite3)并发出文本,所有这些都包括可读的umlauts。。。 非常感谢Python 哪种编码方法最可靠?,python,encoding,diacritics,Python,Encoding,Diacritics,我对python相当陌生,但由于我的母语包含一些讨厌的UMLAUT,我不得不陷入一场噩梦:编码一开始就是正确的。 我阅读了joelonsoftware的编码文本,了解了代码点和字母的实际呈现之间的区别(以及unicode和编码之间的联系)。 为了让我摆脱困境,我找到了3种处理UMLAUT的方法,但我无法决定哪种方法适合什么情况。 如果有人能给它点颜色看看?我希望能够将文本写入文件,从中读取(或sqlite3)并发出文本,所有这些都包括可读的umlauts。。。 非常感谢 # -*- coding
# -*- 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()
编辑:
我测试了这个(文件的内容是'Österreichs Kapitän'):
我是否必须在代码中的任何地方使用u'string(unicode)?我发现,如果我只使用空白字符串(没有“u”),UMLUUT的替换就不起作用了。< P>作为一个一般的经验法则,你通常想尽早解码一个编码字符串,然后将它作为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中才需要导入
对于潜在的陷阱,你可以看看。基本上,您不想混合使用utf-8编码字符串和unicode字符串。非常感谢,这给了我一些见解。。。张贴代码在注释中不起作用吗?您可以单击注释字段旁边的
help
按钮了解接受的语法(他们称之为迷你标记)。注释中的代码应该用倒勾(`)括起来。谢谢。我是否必须写u“sterreich”
才能工作,例如替换字母?请参阅我编辑的问题,了解整个示例。。。
from __future__ import unicode_literals