orangain flavor

じっくりコトコト煮込んだみかん2。知らないことを知りたい。

Djangoでの普通の文字列とUnicode文字列の違い

先日Pythonでの普通の文字列とUnicode文字列の違いについて触れましたが、今回はそれを前提としてDjangoでの扱いを見ていきます。

Djangoの内部では基本的にUnicode文字列が使用されています。しかし、コードを書くときは普通の文字列ももちろん使用できます。普通の文字列を使用しても、Djangoが必要に応じてUnicodeに変換してくれるからです。

先日見たように普通の文字列には様々なエンコーディングを使用できます。Djangoはこれをどう解釈するのでしょうか?

Djangoでは普通の文字列は常にUTF-8エンコードされているとみなします。そのため特に気にすることなくUTF-8の文字列とUnicode文字列の両方を使用できます。もし他のエンコーディングの普通の文字列を使用する(例えば#coding:sjisとしたファイルで日本語文字列リテラルを使用する)と、Django内部のどこかでUnicodeDecodeErrorが発生するでしょう。

他にもUnicode関連の話題はPage removed | Django(日本語版)にありますが、特に気にしなくても開発できると思います。

一応ポイントを簡単に述べると

  • データベースはUTF-8UTF-16を使う
  • 普通の文字列・Unicode文字列の他に、遅延翻訳オブジェクトがある
  • UTF-8の文字列からUnicode文字列への変換はdjango.utils.encoding.smart_unicodeを使う
  • モデルの文字列表現の実装には__unicode__を使う
  • リクエストのエンコーディングはrequest.encodingを設定すると変更できる

といったところです。