【问题标题】:Which of those encoding methods is the most reliable one?这些编码方法中哪一种是最可靠的?
【发布时间】:2013-06-28 18:24:47
【问题描述】:

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

【问题讨论】:

    标签: python encoding diacritics


    【解决方案1】:

    作为一般经验法则,您通常希望尽可能早地解码编码字符串,然后将其作为 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 字符串。

    【讨论】:

    • 非常感谢,这给了我一些见解...在 cmets 中发布代码不起作用吗?
    • 您可以单击评论字段旁边的help 按钮以了解可接受的语法(他们称之为迷你Markdown)。 cmets 中的代码应该用反引号(`) 括起来。
    • 谢谢。我必须写u"österreich" 才能工作吗?替换字母?请参阅我编辑的问题以了解整个示例...
    猜你喜欢
    • 2016-11-08
    • 2016-07-11
    • 2015-06-19
    • 2020-03-12
    • 2011-03-15
    • 1970-01-01
    • 2013-01-28
    • 2020-11-22
    • 2014-07-30
    相关资源
    最近更新 更多