処理系のマルチバイト文字の扱いについて考える - Scheme VM を書く

現在開発中の Wiki でもマルチバイト文字を使いたいので、そろそろ処理系のマルチバイトの扱いを考える。
今まであまりまじめに考えていなかったけど、某言語のように泥沼にならぬようにしないと。
わりと未知のゾーンなので回り道や学習コストを許容しよう。

大きな方針

  • 周辺情報の調査
  • 何を考慮すべきなのかを列挙
  • 代表的な処理系の採っている方針の調査
  • 方針の決定
  • 実装の方針の決定

何を考慮すべきなのか?

思いつくままに

Gauche の採用している方針

コンパイル時に内部エンコーディングを指定できる。
char_utf_8.h などのヘッダで エンコーディング方式による違いを吸収している。
内部エンコーディング方式を、コンパイル時に決められるということは、例えば ascii 文字圏の人には優しいかもしれない。
絶対にマルチバイト文字を使わないと分かっていれば、メモリの節約もできるしね。
でもメモリの問題だけに限れば最近ではそこまで問題にはならない気がする。

方針

方針はこんな感じ。

read-char

read-char はマルチバイト文字を解釈する必要がある。
UTF8 でエンコードされたバイト列と fgetc していき、1文字分読み込んで内部エンコーディング形式にして makeChar して返す。

string-length

string は内部エンコーディングの文字(1文字4byte)の配列になるので、「あいう」は3を返す。

char->integerの挙動

内部エンコーディングの整数を返せば良い。

正規表現

内部エンコーディング
鬼車を使っているので ONIG_ENCODING_UTF32_LE を指定すればよさげ。

処理系の出力

内部エンコーディングUTF-8 に変換して出力すれば良い。

Scheme ソースコード

UTF-8 で書かれていること前提に、read し、内部エンコーディングに変換。

実装方針