従来、文字列は単なるバイトの配列として扱われてきました。 そのため一文字が複数バイトを占めるようになっても 文字列は単純な文字の配列であると考えられがちですが、 Gaucheにおいては、そうではありません。
Gaucheは内部的にマルチバイト文字列をサポートします。 すなわち、文字列中の文字が占めるバイト数は一定していません。 Schemeの文字列プリミティブのセマンティクスは保たれているので、 詳細を気にしないでもプログラムは書けますが、 下にあげるいくつかの点を知っておいたほうが良いでしょう。
文字列オブジェクトは型タグと文字列本体へのポインタを保持しています。
文字列本体は「copy-on-write」方式で管理されます。すなわち、substring
や正規表現を使って部分文字列を切り出したり、あるいは単に文字列をコピーした場合、
文字列オブジェクトそのものは別につくられますが、文字列本体は共有されます。
文字列が破壊的に変更される場合にのみ、文字列本体がコピーされます。
したがって、make-string
である大きさの文字列をあらかじめアロケート
しておき、string-set!
で順に埋めて行くようなアルゴリズムは
Gaucheでは非常に効率が悪くなります。そのようなアルゴリズムは使わない方が良いでしょう。
(そのようなアルゴリズムはマルチバイト文字列とも相性が良くありません)。
文字列を順に埋めて行く場合はstring portsを使うのが
効率の良い方法です (文字列ポート参照)。
string-scan
(文字列を扱うその他の手続き参照) や正規表現
(正規表現参照) など文字列を検索するプリミティブは、
インデックスを介さずに一致した文字列を直接返すことができます。
他の文字エンコーディングからの変換は特別なポートを使って行われます。
gauche.charconv
- 文字コード変換 を参照して下さい。
ソースプログラムのエンコーディングを指定する方法については 次の章で説明します。