gpt4 book ai didi

python - 这些编码方法中哪种是最可靠的?

转载 作者:太空宇宙 更新时间:2023-11-03 15:19:29 24 4
gpt4 key购买 nike

我是 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()

编辑:我对此进行了测试(文件内容为“Österreichs Kapitä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(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 字符串。

关于python - 这些编码方法中哪种是最可靠的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17407741/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com