3

我对 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'),替换变音符号不起作用......

4

1 回答 1

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'了,它就有 type 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 字符串。

于 2013-07-01T16:00:16.550 回答