以前、このような記事を書きまして、MovableType 上で Unicode 追加面の漢字を使った記事を投稿する方法を書きました。
つい先日リリースされました MovableType 5.2 ではこの方法が変わっていましたのでもう一度まとめてみます。
そもそも追加面とは?
追加面 とは、基本多言語面(Basic Multilingual Place : 以下 BMP)に対する言葉です。BMP とは Unicode の中でも最も基本的な文字が並ぶ領域のことであり、Unicode というものが出来たときは、ここに含まれる 65,536 文字で世界中全ての文字体系を網羅しようと考えられていました。
しかし、漢字というものはとにかく字数が多いのです。スマートフォンなどを含む、コンピュータ上で扱える文字体系として一般的な JIS X 0213 では 約 10,000 字、日本の戸籍に記載できる文字として政府が定める 戸籍統一文字 ではなんと、約 56,000 字 の文字が登録されています。日本より遙かに多い漢字を扱う中国の文字体系を包含することを考えると頭が痛くなってきます。
UTF-8 で追加面の文字を表す
Unicode では BMP 内の文字は U+0000 〜 U+FFFF
というように表されます。これを UTF-8 で表すと次のようになります。
Unicode | UTF-8 | |
---|---|---|
コード | バイト数 | |
U+0000 〜 U+007F | 00 〜 7F | 1 Byte |
U+0080 〜 U+07FF | C2 80 〜 DF BF | 2 Byte |
U+0800 〜 U+FFFF | E0 A0 80 〜 EF BF BF | 3 Byte |
このようにバイト数が可変であることが UTF-8 の特徴です。これにより、00 〜 7F
の区間では ASCII コードとの互換性が保たれています。
これを拡張し、更に多くの文字を表すための方法が考えられました。
Unicode | UTF-8 | |
---|---|---|
コード | バイト数 | |
U+10000 〜 U+1FFFFF | F0 90 80 80 〜 F7 BF BF BF | 4 Byte |
U+200000 〜 U+3FFFFFF | F8 88 80 80 80 〜 FB BF BF BF BF | 5 Byte |
U+4000000 〜 U+7FFFFFFF | FC 84 80 80 80 80 〜 FD BF BF BF BF BF | 6 Byte |
最後の方はとんでもないことになっていますね。単純計算で 2,147,483,647 字 が表せるようになったわけです。
実際にはこの全てのコードが使用されるわけではありません。現在 Unicode で使用されているのは高々 U+1FFFFF
までの範囲ですので、4 Byte あれば足りるということになります。
MySQL で 4 Byte UTF-8 を使うための設定
MySQL では MySQL 5.5 にて 4 Byte UTF-8 への対応が行われました。ただし、以前のシステムとの互換性を持たせるために、utf8
という名前の文字コードは 3 Byte UTF-8 のために使用されます。4 Byte UTF-8 を扱うための文字コード utf8mb4
というものが新設されました。
この辺は以下の記事を参考にしてください。
漢(オトコ)のコンピュータ道: MySQL 5.5新機能徹底解説
http://nippondanji.blogspot.jp/2010/12/mysql-55.html
【MovableType, MySQL】記事中に BMP 外の文字を使う – blog.delphinus.dev
https://blog.delphinus.dev/2010/07/use-non-bmp-characters-in-movabletype.html
【MovableType, MySQL】記事中に BMP 外の文字を使う – blog.delphinus.dev
https://blog.delphinus.dev/2010/07/use-non-bmp-characters-in-movabletype.html
最終的には以下のような SQL を実行することで 4 Byte UTF-8 への対応を行います。
alter table mt_entry default character set utf8mb4, collate utf8mb4_general_ci; alter table mt_entry modify `entry_atom_id` varchar(191) CHARACTER SET utf8mb4 DEFAULT NULL ,modify `entry_basename` varchar(191) CHARACTER SET utf8mb4 DEFAULT NULL ,modify `entry_class` varchar(191) CHARACTER SET utf8mb4 DEFAULT 'entry' ,modify `entry_convert_breaks` varchar(30) CHARACTER SET utf8mb4 DEFAULT NULL ,modify `entry_excerpt` mediumtext CHARACTER SET utf8mb4 ,modify `entry_keywords` mediumtext CHARACTER SET utf8mb4 ,modify `entry_pinged_urls` mediumtext CHARACTER SET utf8mb4 ,modify `entry_tangent_cache` mediumtext CHARACTER SET utf8mb4 ,modify `entry_text` mediumtext CHARACTER SET utf8mb4 ,modify `entry_text_more` mediumtext CHARACTER SET utf8mb4 ,modify `entry_title` varchar(191) CHARACTER SET utf8mb4 DEFAULT NULL ,modify `entry_to_ping_urls` mediumtext CHARACTER SET utf8mb4 ;
MovableType で 4 Byte UTF-8 を扱うための設定
MovableType 5.2 で 4 Byte UTF-8 を扱うためにはソースにちょっと細工する必要があります。
--- Original +++ 4 2012-10-08 01:10:16 PM @@ -67,7 +67,7 @@ # MySQL 4.1+ and non-latin1(database) == needs SET NAMES call. my $c = lc $cfg->PublishCharset; my %Charset = ( - 'utf-8' => 'utf8', + 'utf-8' => 'utf8mb4', 'shift_jis' => 'sjis', 'shift-jis' => 'sjis', 'euc-jp' => 'ujis',
更に、mt-config.cgi
内に以下の記述を追加します。
PublishCharset utf-8
修正が終わったら MovableType を再起動します。以下の例は、MovableType を PSGI/Plack で稼働している場合のものです。
$ cd /path/to/mt
$ sudo kill cat pids/mt.pid
実際に書いてみる
ここまですめば、後は記事中に問題なく漢字が書けるはずです。ちゃんと書けてるかな? XP@IE8 ではうまく表示されないようですね……。XP ユーザーは Firefox とか使ってくだしあ
【𠏹】【𠝏】【𡉕】【𡉻】【𡋗】【𡋽】【𡴭】【𡵅】【𡵢】【𡶒】 【𡶷】【𡽶】【𢭏】【𣇃】【𣏐】【𣕚】【𣖔】【𣘹】【𣟧】【𣱿】 【𣷓】【𤭖】【𥐮】【𥓙】【𥮲】【𥸮】【𥹖】【𥼣】【𨕫】【𨦻】 【𨵱】【𨸶】【𨺉】【𩗏】【𩣆】【𩸽】【𩸕】【𩹉】【𪀯】
参考: 稀少地名漢字リスト
http://pyrite.s54.xrea.com/timei/index.html