FlaskのUnicode—Flaskドキュメント

提供:Dev Guides
< FlaskFlask/docs/1.0.x/unicode
移動先:案内検索

FlaskのUnicode

Flaskは、Jinja2やWerkzeugと同様に、テキストに関しては完全にUnicodeベースです。 これらのライブラリだけでなく、テキストを処理するWeb関連のPythonライブラリの大部分も。 これまでUnicodeを知らない場合は、おそらくすべてのソフトウェア開発者が絶対に、Unicodeと文字セットについて絶対に知っておく必要があるを読む必要があります。 ドキュメントのこの部分は、Unicode関連のことを快適に体験できるように、非常に基本的なことをカバーしようとしているだけです。

自動変換

Flaskには、基本的で痛みのないUnicodeサポートを提供するアプリケーション(もちろん変更できます)に関するいくつかの仮定があります。

  • Webサイトのテキストのエンコーディングは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をお勧めします。 インタプリタにエンコーディングを伝えるには、Pythonソースファイルの1行目または2行目に# -*- coding: utf-8 -*-を挿入します。
  • 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)
  • Notepad ++:

    1. 設定->設定…に移動します

    2. 「新しいドキュメント/デフォルトディレクトリ」タブを選択します

    3. エンコーディングとして「BOMなしのUTF-8」を選択します

    Unixの改行形式を使用することもお勧めします。同じパネルで選択できますが、これは必須ではありません。