CommonLispで日本語をstreamにしたかったのでcl-japanese-streamsとか作ってみた

投稿者: | 2014年3月26日

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の存在が無視できなかったので作ってしまいました…)

それでは。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です