背景
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段落して前に進むことにする。
知るべき必要のあることはいずれわかる(はず)