[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.2 マルチバイト文字列

従来、文字列は単なるバイトの配列として扱われてきました。 そのため一文字が複数バイトを占めるようになっても 文字列は単純な文字の配列であると考えられがちですが、 Gaucheにおいては、そうではありません。

Gaucheは内部的にマルチバイト文字列をサポートします。 すなわち、文字列中の文字が占めるバイト数は一定していません。 Schemeの文字列プリミティブのセマンティクスは保たれているので、 詳細を気にしないでもプログラムは書けますが、 下にあげるいくつかの点を知っておいたほうが良いでしょう。

文字列オブジェクトは型タグと文字列本体へのポインタを保持しています。 文字列本体は「copy-on-write」方式で管理されます。すなわち、substring や正規表現を使って部分文字列を切り出したり、あるいは単に文字列をコピーした場合、 文字列オブジェクトそのものは別につくられますが、文字列本体は共有されます。 文字列が破壊的に変更される場合にのみ、文字列本体がコピーされます。

したがって、make-stringである大きさの文字列をあらかじめアロケート しておき、string-set!で順に埋めて行くようなアルゴリズムは Gaucheでは非常に効率が悪くなります。そのようなアルゴリズムは使わない方が良いでしょう。 (そのようなアルゴリズムはマルチバイト文字列とも相性が良くありません)。 文字列を順に埋めて行く場合はstring portsを使うのが 効率の良い方法です (文字列ポート参照)。

string-scan (文字列を扱うその他の手続き参照) や正規表現 (正規表現参照) など文字列を検索するプリミティブは、 インデックスを介さずに一致した文字列を直接返すことができます。

Gaucheのコンパイル時に、文字の内部エンコーディングを選択することができます。 実行時に手続きgauche-character-encodingによってどの内部エンコーディング でコンパイルされたかを知ることが出来ます。 今のところ、以下のエンコーディングがサポートされています。

euc-jp

ASCII、JIS X 0201カナ、JIS X 0212及びJIS X 0213:2000文字集合のEUC-JP エンコーディング

sjis

JIS X 0201カナ及びJIS X 0213:2000文字集合のShift-JISエンコーディング。 ソースコードの互換性のため、文字コード0から0x7fの範囲はJIS X 0201 roman ではなくASCIIにマップされます。

utf-8

UnicodeのUTF-8エンコーディング。

none

8ビット固定長の文字エンコーディング。文字コード0から0x7fの範囲はASCIIと みなします。文字列をどのエンコーディングとして解釈するかはアプリケーション次第です。

他の文字エンコーディングからの変換は特別なポートを使って行われます。 gauche.charconv - 文字コード変換 を参照して下さい。

ソースプログラムのエンコーディングを指定する方法については 次の章で説明します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]

This document was generated by Shiro Kawai on November, 22 2009 using texi2html 1.78.