【メモ書き】Djangoのmodelクラスを定義する時に、__unicode__が必要な意義


背景

Djangoの練習でブログを作ってるんですが、以下のようなモデルを教科書に従って定義した。その時unicodeのところの意義がいまいち分からなかったのでまとめ

class Blog(models.Model):
    title = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=100, unique =True)
    body = models.TextField()
    posted = models.DateField(db_index=True,auto_now_add=True)
    category = models.ForeignKey('blog.Category')

    def __unicode__(self):
        return '%s' % self.title

unicodeとは?

多くの人が知っている(らしい)のですが、もちろん初心者の僕は知りません。僕は自称「ググるカス」なので、カスはカスらしくググりました。

unicodeは何百万種類もある言語をコンピューターで統一的に扱うための手段の1つ。

コンピューターが自然言語を理解するための方法はたくさんあって、例を出すと、

  • utf8
  • ASCII

とからしい。

で、これらの方法ではencodeっていうコンピューターが理解できるための1工夫みたいなのをしているんだけど、どうもそれがそれぞれの方法によって違うらしい。

で、もちろん普通のpythonで文字列を扱えばencodeされるんだけど、webで読む人のバックグラウンドがたくさんあって、しかもそれぞれ異なる方法を使ってコンピューターと自然言語でやりとりが行われているので、読む人の環境によってめちゃくちゃなことになるらしい。

もう少し詳しく

例えば、文字AをASCIIによってencodeしてコンピューターで保管しておくとする。そんで、呼び出す人の環境がutf-8の場合どうなるのかを考えてみる。

文字A → ASCII → 文字コード = 123456

といったコードで保存されているとする。

で、呼び出す人の環境がutf-8だとすると、、、

文字コード = 123456 → utf-8 → 文字B

といった感じで異なる文字列が帰ってくる。もじくは同一の文字列が存在しなくって、webページ全体が??????????????ってなったりする。

unicodeの問題点とは?

ここまで来て「全ての文字コードをunicodeで扱えばいいじゃん?」と思ったんだけど、そこまで世の中都合よくいかないらしい。天は2物を与えるときもあるだろうけど、どうやら人間の世界はいつもトレードオフっぽい。

unicodeはコンピューターにとっての統一規格である能力を得たかわりに、人間に見せるための機能を放棄した

っぽい。というか、そうじゃなければ辻褄が合わないので、暫定そうやって理解しておくことにした。(なのでタイトルがメモ書きなのです。)

Djangoでは文字コードはどのように扱われている?

Djangoに話を戻す。

Djangoでは、framework内では全ての情報がunicodeでやりとりされているようだ。で、unicodeは人間に見せる際に少しサボるので、そこを修正してあげるために、modelのところに unicodeと書く必要があるんだとか。

とりあえず、突っ込みどころ満載な状況で記事が終わっているんだけど、そこはとりあえず1段落して前に進むことにする。

知るべき必要のあることはいずれわかる(はず)