BK通信 - 文字コードのバッドノウハウ

最終更新日: 2009-01-13

WEB+DB PRESS Vol. 49 に向けて書いた記事の元の原稿です。


ソフトウェアなどを使いこなすために、ストレスを感じながらもしぶしぶ覚えなければならないようなノウハウ、「バッドノウハウ」がテーマの本連載、最終回の今回は文字コードのBK を取り上げたいと思います。

文字コードとバッドノウハウ

文字コードは、ウェブ開発を行う上で避けては通れない分野です。文字化けを起こさずに、コンテンツをブラウザに正しく表示させることはウェブ開発の基本といえます。

しかしながら、文字コードには歴史的な紆余曲折がいろいろあり、膨大なバッドノウハウが人類の英知として蓄積されています。今回はその膨大なる BK の一部を紹介したいと思います。

機種依存文字は滅びず

文字コードのBKといえば機種依存文字の存在を忘れてはなりません。インターネットの世界では、古くから「① などの丸付き数字は機種依存文字だから使うな」と言われています。

これらの文字はその昔「NEC 特殊文字」と呼ばれ、Mac との相性が悪いことで知られていました。たとえば、「①」が含まれるテキストファイルを Windows で作って Mac で開くと「㈰」と表示されるといった具合です *1

この問題は最近ではどうなったのかと思い、調べてみました。まず最初に、丸付き数字①②③を含むページを CP932 という文字コード*2 で保存し、 Mac のブラウザで表示してみました。その結果、Firefox, Safari とも、問題なく丸数字を表示できました *3。幸いなことに、最近の Mac のブラウザではこの問題は解決しているようです。

無事に表示されました
無事に表示されました

人類の進歩だ!
人類の進歩だ!

次に、丸付き①②③数字を含むメールを ISO-2022-JP *4という文字コードで送信し、 Mac の Mail で受信してみました *5。結果はなんと。。

見事に文字化け
見事に文字化け

見事に文字化けしました。機種依存文字という言葉は最近あまり聞かなくなったので、既に克服されていると思っていたのですが、まだまだ健在のようです。

相変わらずこれかよ!
相変わらずこれかよ!

絵文字をめぐる混乱

携帯電話の世界では欠かせない絵文字、これも機種依存文字の一種といえます。各キャリアごとに使える絵文字が異なり、使われている文字コードも異なります。たとえば、太陽の絵文字を各キャリアの Shift_JIS *6 で扱うには DoCoMo の場合 F89F、 au の場合 F660、SoftBank の場合 F98B というコードになります *7

さらに厄介なことに、SoftBank の一部の絵文字は「IBM拡張文字」との互換性にも問題があります。たとえば、苗字に使われる「瀨」という文字は CP932 では FB50 というコードが割り当てられていますが、 SoftBank の Shift_JIS では FB50 はショックを受けた顔文字になります*8

瀨戸のホームページのはずが...
瀨戸のホームページのはずが...

これらの混乱のため、ネット上には絵文字に関する膨大な BK が蓄積されています。Perl の Encode::JP::Mobile といった相互変換ライブラリや、SixApart の自由に使える絵文字アイコン画像 *9 といった先人の成果により、絵文字の扱いはだいぶ楽になりつつあります。

また、最近では Unicode の専門家等による emoji4unicode プロジェクト*10 が発足し、絵文字を Unicode に追加する計画が進行しています。絵文字の混乱を鎮めるためにはまだまだ多くの労力が必要そうです。

絵文字の登場により、機種依存文字の悪夢がふたたびやってきた、といった感じでしょうか。

歴史は繰り返すものである
歴史は繰り返すものである

Mac のファイル名と NFD

最近では UTF-8 を使ったウェブサイトが主流になってきました *11。筆者が扱うテキストデータは最近ではほとんど UTF-8 です。いろいろな文字コードのデータが混在していた頃と比べると、ずいぶんシンプルになりました。

とはいえ、 UTF-8 にすれば、すべてシンプルになるかといえば、そうでもありません。たとえば、 Mac OS X ではファイル名に UTF-8 を用いていますが、 Normalization Form D (NFD) という正規化が行われているため要注意です*12

たとえば、「が.txt」というファイルを Mac OS X で作ると、ファイル名は "\xe3\x81\x8b\xe3\x82\x99.txt" のようにエンコードされます。Python で簡単に確認できます。

% python
>>> import os
>>> os.listdir(".")
['\xe3\x81\x8b\xe3\x82\x99.txt']

通常、「が」は UTF-8 でエンコードすると \xe3\x81\x8c という1 文字になりますが、NFD 形式では \xe3\x81\x8b と \xe3\x82\x99 という 2つの文字に分解されています。

このため、「が.txt」という名前のファイルを見つけるには、文字列を NFD 形式に正規化した上で比較する必要があります。Python の場合、NFD 形式への正規化は unicodedata モジュールで行えます。

import unicodedata
import os
# NFD 形式に正規化
target = unicodedata.normalize(
    'NFD', '\xe3\x81\x8c.txt'.decode('utf-8'))
for file_name in os.listdir('.'):
    if file_name.decode('utf-8') == target:
        print 'found'

前号でも述べたように、日本語のファイル名は永遠のBKのテーマです。

やっぱり手ごわい日本語ファイル名!
やっぱり手ごわい日本語ファイル名!

まとめ

今回は文字コードに関するバッドノウハウを紹介しました。文字コードの世界には他にも「波ダッシュと全角チルダ」「サロゲートペアと MySQL」「冗長な UTF-8とセキュリティホール」などなど、今回取り上げなかった BK がうずまいています。興味の方はぜひネットで調べてみてください。

文字コードはまさにBKの宝庫といえよう
文字コードはまさにBKの宝庫といえよう

一年間、6回に渡ってバッドノウハウについて書きました。BK の背後には何かしらの理由があり、それらの教訓から学ぶことは、ソフトウェア開発を学ぶ上で大切なことではないかと思います。本連載が読者の皆様に BK の面白さを伝えることができれば幸いです。


*1http://mikeneko.creator.club.ne.jp/~lab/kcode/vendor.html に機種依存文字についての詳しい解説があります。特に Apple の歴史は興味深い内容です。
*2Shift_JIS を拡張して、NEC 特殊文字などを含めた文字コード。 http://www2d.biglobe.ne.jp/~msyk/charcode/cp932/ に詳しい解説があります。同じ文字が重複して登録されているなど、奥が深い文字コードです。たとえば髙 は EEE0 でも FBFC の2つのコードを持ちます。
*3Mac OS X 10.5 の Safari 3.0.4 と Firefox 3.0.5 で動作確認。
*4厳密にはISO-2022-JP はこれら文字を含まないのですが、Windows 上の多くのメーラーでは送ることができます。
*5Mac OS X 10.5 の Mail 3.5
*6各キャリアともに絵文字を追加した独自の Shift_JIS を定義しています
*7絵文字には他にも au の <img localsrc> や SoftBank の「Web コード」といった恐るべきBKがあります。興味のある方はネットで調べてみてください。
*8SoftBank 913SH で動作確認しました。
*9<http://start.typepad.jp/typecast/>
*10<http://code.google.com/p/emoji4unicode/>
*11http://googleblog.blogspot.com/2008/05/moving-to-unicode-51.html によるとウェブで最も使われている文字コードは UTF-8 とのことです。
*12Unicode の正規化については http://homepage1.nifty.com/nomenclator/unicode/normalization.htm に詳しい解説があります。