スケーラブルWebサイト(4章)

もはや書評でも何でもなく、ただのまとめになっていますが。。

第4章 国際化とローカライゼーションとUnicode

  • ここでは章のタイトルの通り、国際化(i18n)とローカライゼーション(L10n)とUnicodeについて取り上げられており、特にUnicodeについてはこれまで勉強していなかったのでとても勉強になりました。
  • i18n」と「L10n」ってそれぞれ、「i(nternationalizatio = 18文字)n」と「L(ocalizatio = 10文字)n」の省略形なんですね。知りませんでした。
  • 国際化
    • 国際化とは、アプリケーションに世界各国のテキストを入力、処理出力する機能を追加すること。
    • 上記の手段として、ここでは、Unicodeが紹介されています。
  • ローカライゼーション
    • ユーザーが選択したロケールに基づいて(通常はテキストのみ)異なるインターフェイスをユーザーに提示すること。
    • ここでは、ローカライゼーションの方法として、「gettext」、「複数のテンプレートセット」、「複数のフロントエンドの構築」が紹介されていますが、内容については紹介されていません。Unicodeについて書くための導入部分としての紹介という感じです。
Unicode
  • まずは冒頭で文字コードとは?エンコーディングとは?といった曖昧な点をわかりやすく説明されています。
    • 文字の形のことを「グリフ」といい、コードポイント(文字コードの数値)に対して割り当てられている具体的な字形。
      • グリフの集合を「フォント」と呼ぶ。
    • 字形(a)とビット(01100001)を結び付けるには下記の2つのマッピングが必要。(多くの場合は2つは一緒にされている)
    • 文字セット・・・抽象的な文字(字形のこと?)をコードポイント(数値)に変換する方法を決めるもの。
      • 「a」という形と「a」という文字を結びつける!?
    • エンコーディング・・・コードポイントとビットを結びつけるもの。
      • 「a」という文字を示しているコードポイントをコンピューターが理解できるビット列に結びつけるもの!?
    • 例「a」
      • ASCII・・・コードポイント「0x61」、ビット表現「0x61」
      • UTF-16・・・コードポイント「U+0061(0x61)」、ビット表現「0x00 0x61」
Unicodeエンコーディング(一部例外については言及していません。)
UTF-8エンコーディング
  • ラテン文字が多い文字列ではサイズが小さくなる。ということは、日本語の文字列ではサイズが大きくなる。
  • ASCIIと完全に互換性があるので使いやすいですね。(Shift-JIS、EUC-JPもそうですが)
  • 先頭バイトでコードポイントを表現するバイト数を示しており、後続バイトに実際のコードポイントを使用している。
    • 基本的だと思うのですが、こうやってバイト数を示していることは知らなかったので勉強になりました。
コードポイント ビット表現
1バイト・・・0XXXXXXX
2バイト・・・110XXXXX 10xxxxxx
3バイト・・・1110XXXX 10xxxxxx 10xxxxxx
4バイト・・・11110XXX 10xxxxxx 10xxxxxx 10xxxxxx
5バイト・・・111110XX 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6バイト・・・1111110X 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
7バイト・・・11111110 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
8バイト・・・11111111 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
  • 日本語は大体3バイト。
  • バイトでそのままソートすればコードポイント順にソート出来る。
  • 合字などを除いて上記だけで考えてみるととてもわかりやすいなぁと思いました。
UTF-8ウェブアプリケーションで使う
  • ここではウェブアプリケーションUTF-8を使用する際の注意点について書かれています。
  • 日本語を使用するとファイルサイズや通信量が大きくなる。
  • HTMLを出力する際は、HTTPヘッダとmetaタグの両方にcharset指定することが望ましい。
  • PHPPerlRubyなどのプログラミング言語Unicodeサポート情報についても記載されていますが、情報が少し古いので省略。。
  • MySQLでは、4.1以降でUTF-8をはじめ複数の文字セットと整列規則がサポートされるようになった。char(10)とすればバイト数に関係なく10文字格納出来るようになった。
    • ただし1文字は3バイトまで。
    • (4.1より前はchar(10)は10バイトだった。)
  • 電子メールでUTF-8を使用する場合は、ヘッダにUTF-8を入れることが問題になるので、RFC1342で定義した下記の方法によってエンコードし、送信します。
形式:=?<文字セット>?<エンコーディング>?<エンコードされたテキスト>?
例:   =?utf-8?Q?hello_=E2=98=BA?=
    エンコーディングのBはBase64形式、QはQuoted-Printableの変種(ASCII文字列の場合、エンコードした後も理解しやすい。)
  • JavaScriptについては、escape()関数をURLに含める文字列で使用する時、Unicode文字をサポートしていないので注意が必要とあります。今だとURLのエンコードを行うには、「encodeURI()」か「encodeURIComponent()」をエンコードしたい文字種に応じて使い分ければいいと思っているのですが間違いない?
  • というわけで、ウェブアプリを作っている人にとっては、常識的なことばかりであるかもしれませんが、文字コードについて勉強しなかったのでとても勉強になった章でした。
  • 第5章の「データの一貫性とセキュリティ」についてはまた後日。。。