CommonLispは日本語の扱いがいまいち使いづらいです。
特に外部ファイルに対して読み書きする場合が辛いです。
処理系によって扱いやすいエンコードが違ったりするので以下のような流れで
日本語のファイルの読み書きを行うのが普通ではないでしょうか?
読み込みの場合には、
- 外部ファイルを:element-type ‘(unsigned-byte 8)で開く(要はバイナリデータとして扱う)。
- babelなどで上記バイナリデータを処理系が扱いやすい文字列に置き換える
としてやっと読み込む。
書き込みの場合には
- 文字列データをbabelでバイナリデータに変換する
- 上記バイナリデータをバイナリデータとしてファイルに書き込む
という手順になります。
この方法で読み書きするという目的は達成できますが、扱うストリームがバイナリストリームなので
read-char, read-lineなどの文字列ストリームとして扱えないので不便です。
この問題を解決するためにcl-japanese-streamsとか作ってみました。
日本語ファイルや文字列リテラルからbabelを使って1文字ずつ読み込んで文字列ストリームに変えているだけのものです。
これでとりあえず、read-char, read-lineと言った文字単位で読み込みできるようになります。
制限事項としては、unread-charとかすると現状対応できないので、そのうち対応します。
例によってドキュメントが未整備なのでそのうち書きますが、
- with-open-japanese-file
日本語のファイルを文字列ストリームとして開く -
make-japanese-input-stream
日本語の文字列リテラルを文字列ストリームとして扱う
と言った感じです。
作っておいてなんですが、SBCL, ACLなどの主要なCommonLisp実装はUNICODEの対応が割りとしっかりしていて、
さらに、世の中の日本語ファイルは殆どUTF-8になってそうなので余り困らなくなりつつある気もしますね。
(でもcp932とかが大好きなOSの存在が無視できなかったので作ってしまいました…)
それでは。