Common Lisp で日本語処理ができないということはありません.ただ Common Lisp の規格には多言語処理が含まれていないこと,また,マシンが決まれば処理系が事実上一つしかない Perl や Python と異なって数多くある Common Lisp 処理系から日本語処理に適したものを選ばなければならないということがあります.それは日本語処理機能がベンダーや処理系によってちょっとづつ異なるからです.

日本語処理のためのコードとしては,unicode とすることに異論はないでしょう.すでにほとんどの Linux と Common Lisp 処理系は unicode を前提としています.そしてセマンティックウェブの世界でもunicodeが文字コードの条件になっています.

Common Lisp の日本語処理については,「実践Common Lisp」の付録に訳者らによって書かれたものが現在一番確かな資料になるでしょう.本シリーズの記述も,ここを出発点として始まります.さて,一口に unicode と言っても,私の見るところ,日本語処理で今最大の問題とせざるを得ないのはサロゲートペアの扱いです.これは Lisp に限ったことではありません.サロゲートペアとは何かは,ちょっとググっていただければ,一杯でてきますから,そちらを見ていただくとして,試しにWikipediaで「辰吉丈一郎」のページをみてください.

すると右側に「本来の表記は・・・」という注記欄があります.そこの表示は「丈」に点が付いていますがその下のinfoboxについてはいかがでしょうか.もしそれが文字化けしていたら,あなたのコンピュータのブラウザはサロゲートペアの漢字を正しく表示できないことになります.「本来の表記は・・・」の次の文字は実はpngファイルだったんですね.このように,Wikipediaではコンピュータがサロゲートペアをうまく処理できない場合を考えて,色々工夫しているわけです.そして,表題はサロゲートペアを含まないようにしておいて,Wikpedia上の検索では本来の表記の文字(サロゲートペアの文字)を入れても,それをここにredirectするようにしています.

サロゲートペアに当たる漢字にどういうものがあるか,それが表示できるかできないかを調べるには,「サロゲートペア - 闘うITエンジニアの覚え書き」を見てもらうのが一番です.

XPはサロゲートペアを実装していないために,どんなブラウザを持ってきても全滅です.Debian の Google Chrome は「サロゲートペア - 闘うITエンジニアの覚え書き」についてはOKでしたが「Wikipediaで「辰吉丈一郎」のページ」はだめでした.Epiphany はどちらもだめでした.あなたのお手元の処理系とブラウザではどうでしょうか?

Google Chrome は表示する度にサロゲートペアの文字が不安定に変化してしまうのはどうしてでしょうか?これは毎回豆腐や点になるよりもしまつが悪いですね。htmlファイルの問題なのかレンダリングの問題なのか?

ちなみに、「辰吉丈一郎」のページでは当用漢字の「吉」といわゆる「つちよし」(上の部分が土、下が口)の問題も書いてありますが、これは両方共unicode16bitで表現されていて,サロゲートペアの文字ではありません.

さて,日本語処理する場合にサロゲートペアに対する態度を決定しなければなりません.ほとんどいらない漢字として無視するか,あるいはサロゲートペアも扱うべきとするか.個人的利用に限れば,時と場合でいろいろ決めればよいでしょうが,汎用の日本語処理を考えればサロゲートペアを無視するわけにはいかないと考えます.Linked Open Data (LOD) の世界では,Wikipedia から情報を抽出する DBpedia にリンクしないと LOD クラウドに事実上存在しないことになっていますが,そうなると当然このサロゲートペアを無視するわけにはいかない.

そこで Lisp 処理系の話に移りますが,実は Allegro CL はサロゲートペアを無視しています.どの Allegro CL でも char-code-limit は 65536 = (expt 2 16) です.つまり文字表現として16bitしか使っていない.もちろんサロゲートペアのときには特別処理をすればいいのですが,私は Franz のエンジニアから unicode について 16bit で十分だよという話を聞いたことがあるので,サロゲートペアを無視している可能性がある.一方,sbcl では char-code-limit は 1114112 > (expt 2 20) だからサロゲートペアを考慮している可能性があります.

「可能性がある」とあいまいな表現に終始しているのは,いまここでにわかには断言できないからなのなのですが,Common Lisp において,サロゲートペアも含めて処理することを前提として,char-code-limit が 1114112 の処理系を選んで話を進めることとしましょう.そして私が具体的に選ぶのは,Debian 上の sbcl です.

さて次回は,Debian 上の sbcl のセットアップから始めます.
これを機会に,Common Lisp に触ってみようとする人は,お付き合いをお願いいたします.