如何为特定 Python class 启用解码?

How to enable decoding for specific Python class?

我有以下代码:

return render_template(
        'sample.html',
        title=('Härre').decode('utf-8'),
        year=datetime.now().year,
        message = ("Härre guut").decode('utf-8')
    )

以上代码运行良好。但是我想知道是否可以为特定的class启用特殊字符的自动解码?这样我的代码就变成了这样:

return render_template(
        'sample.html',
        title=('Härre'),
        year=datetime.now().year,
        message = ("Härre guut")
    )

如果是那么它是如何完成的?

在我的例子中,特殊字符是字母 ä,它可以用 utf-8 解码。

我尝试在代码的第一行添加以下行:

# -*- coding: utf-8 -*-

然而这无济于事。如果我尝试启用上面的行并取出所有 decode('utf-8') 部分,我会收到以下错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 12: ordinal not in range(128)

这是很明显的错误。它尝试使用 'ascii' 编解码器来解码代码的特殊字符。

如果你想知道我为什么要启用这样的功能,答案是将来我会有更多的render_template()方法。该方法配合Flask框架使用。

如果你只是在谈论你正在输入的字符串,我会尝试在它们前面放一个 u(例如 u'string')。 u 告诉 python 该字符串是 unicode。我过去曾在类似情况下成功地使用过它。

此外,根据 flask docs(底部的方式),要正确使用 # -*- coding: ... 位,您必须将文本编辑器设置为 UTF-8,否则它会保存在 ascii,这可能就是您仍然收到该错误的原因。

冒着过于琐碎的风险,您可以使用 Python 3 使此解码自动进行,它使用 Unicode 而不是 ascii。

否则,正如 Brandon 指出的那样,您确实需要努力 Python 2 才能正确解码您的输入,在您的程序中使用 Unicode,在字符串前面加上令人敬畏的 'u',以及当您使用时的编码输出数据,通常是 utf-8,但任何适合你的。

在 "the edges" 处进行解码和编码,并在两者之间使用 Unicode,工作量很大,但很有必要。这是切换到 Python 3 的一个很好的理由。:-)

只需使用 u 前缀将您的字符串定义为 Unicode 字符串:

return render_template(
        'sample.html',
        title=(u'Härre'),
        year=datetime.now().year,
        message = (u"Härre guut")
)

当您将 non-ASCII 嵌入到您的源代码中时,设置源代码顶部的 'coding' 位。确保您的编辑器的字符编码与 coding header 匹配。

# -*- coding: utf-8 -*-