処理系のマルチバイト文字の扱いについて考える - Scheme VM を書く
現在開発中の Wiki でもマルチバイト文字を使いたいので、そろそろ処理系のマルチバイトの扱いを考える。
今まであまりまじめに考えていなかったけど、某言語のように泥沼にならぬようにしないと。
わりと未知のゾーンなので回り道や学習コストを許容しよう。
大きな方針
- 周辺情報の調査
- 何を考慮すべきなのかを列挙
- 代表的な処理系の採っている方針の調査
- 方針の決定
- 実装の方針の決定
何を考慮すべきなのか?
思いつくままに
Gauche の採用している方針
コンパイル時に内部エンコーディングを指定できる。
char_utf_8.h などのヘッダで エンコーディング方式による違いを吸収している。
内部エンコーディング方式を、コンパイル時に決められるということは、例えば ascii 文字圏の人には優しいかもしれない。
絶対にマルチバイト文字を使わないと分かっていれば、メモリの節約もできるしね。
でもメモリの問題だけに限れば最近ではそこまで問題にはならない気がする。
方針
方針はこんな感じ。
- 文字コードセット UCS-4 を採用。(実際には UCS-2 の範囲だけで十分?、これはUTF-32とは微妙に違う?)
- 文字コードセット UCS-4 を内部コードとして採用する。
- つまり内部的には1文字4byteとして扱う。
- ソースコードの文字エンコーディングは UTF8 に対応する。
- (define ほげ "abc") などと書けるに違いない
- mosh が出力する文字列は UTF8 。
- UTF8 以外で書かれたソースコードは変換で対応(予定)。
read-char
read-char はマルチバイト文字を解釈する必要がある。
UTF8 でエンコードされたバイト列と fgetc していき、1文字分読み込んで内部エンコーディング形式にして makeChar して返す。
string-length
string は内部エンコーディングの文字(1文字4byte)の配列になるので、「あいう」は3を返す。
char->integerの挙動
内部エンコーディングの整数を返せば良い。