Flask 中的 Unicode — Flask 文档

来自菜鸟教程
Flask/docs/1.1.x/unicode
跳转至:导航、​搜索

Flask 中的 Unicode

Flask 与 Jinja2 和 Werkzeug 一样,在文本方面完全基于 Unicode。 不仅是这些库,还有大多数处理文本的 Web 相关 Python 库。 如果您目前还不了解 Unicode,您可能应该阅读 每个软件开发人员绝对、肯定必须了解 Unicode 和字符集的绝对最小值 。 文档的这一部分只是试图涵盖非常基础的知识,以便您对与 Unicode 相关的事物有愉快的体验。

自动转换

Flask 对您的应用程序有一些假设(当然您可以更改),这些假设为您提供基本且轻松的 Unicode 支持:

  • 您网站上的文本编码为 UTF-8
  • 在内部,除了仅具有 ASCII 字符点的文字字符串外,您将始终将 Unicode 专门用于文本。
  • 每当您通过需要传输字节的协议进行交谈时,就会发生编码和解码。

那么这对你意味着什么?

HTTP 基于字节。 不仅是协议,还有用于在服务器上寻址文档的系统(所谓的 URI 或 URL)。 然而,通常在 HTTP 之上传输的 HTML 支持多种字符集,并且使用哪些字符集是在 HTTP 标头中传输的。 为了不让它太复杂,Flask 只是假设如果您要发送 Unicode,您希望它是 UTF-8 编码的。 Flask 会为你编码和设置合适的头文件。

如果您在 SQLAlchemy 或类似的 ORM 系统的帮助下与数据库交谈,情况也是如此。 一些数据库有一个已经传输 Unicode 的协议,如果没有,SQLAlchemy 或您的其他 ORM 应该负责。


黄金法则

所以经验法则:如果您不处理二进制数据,请使用 Unicode。 在 Python 2.x 中使用 Unicode 意味着什么?

  • 只要您仅使用 ASCII 代码点(基本上是数字,拉丁字母的一些特殊字符,没有变音或任何花哨的东西),您就可以使用常规字符串文字('Hello World')。
  • 如果在字符串中需要除 ASCII 以外的任何其他内容,则必须通过在其前面加上小写 u 来将该字符串标记为 Unicode 字符串。 (如 u'Hänsel und Gretel'
  • 如果您在 Python 文件中使用非 Unicode 字符,则必须告诉 Python 您的文件使用哪种编码。 为此,我再次推荐 UTF-8。 要告诉解释器您的编码,您可以将 # -*- coding: utf-8 -*- 放入 Python 源文件的第一行或第二行。
  • Jinja 被配置为从 UTF-8 解码模板文件。 所以一定要告诉你的编辑器把文件保存为 UTF-8 格式。


自己编码和解码

如果您正在使用文件系统或并非真正基于 Unicode 的东西,您将必须确保在使用 Unicode 接口时正确解码。 因此,例如,如果您想在文件系统上加载一个文件并将其嵌入到 Jinja2 模板中,您将必须从该文件的编码中对其进行解码。 这里出现了文本文件未指定其编码的老问题。 因此,请帮自己一个忙,并将自己限制在 UTF-8 文本文件中。

无论如何。 要使用 Unicode 加载此类文件,您可以使用内置的 str.decode() 方法:

def read_file(filename, charset='utf-8'):
    with open(filename, 'r') as f:
        return f.read().decode(charset)

要将 Unicode 转换为特定字符集,例如 UTF-8,您可以使用 unicode.encode() 方法:

def write_file(filename, contents, charset='utf-8'):
    with open(filename, 'w') as f:
        f.write(contents.encode(charset))

配置编辑器

现在大多数编辑器默认保存为 UTF-8,但如果您的编辑器未配置为这样做,您必须更改它。 以下是将编辑器设置为存储为 UTF-8 的一些常用方法:

  • Vim:把 set enc=utf-8 放到你的 .vimrc 文件中。

  • Emacs:要么使用编码 cookie,要么将其放入 .emacs 文件中:

    (prefer-coding-system 'utf-8)
    (setq default-buffer-file-coding-system 'utf-8)
  • 记事本++:

    1. 转到 设置 -> 首选项 ...

    2. 选择“新建文档/默认目录”选项卡

    3. 选择“UTF-8 without BOM”作为编码

    还建议使用 Unix 换行符格式,您可以在同一面板中选择它,但这不是必需的。