Next: マルチバイトスクリプト, Previous: 標準への準拠, Up: 主要な概念 [Contents][Index]
従来、文字列は単なるバイトの配列として扱われてきました。 そのため一文字が複数バイトを占めるようになっても 文字列は単純な文字の配列であると考えられがちですが、 Gaucheにおいては、そうではありません。
Gaucheは内部的にマルチバイト文字列をサポートします。 すなわち、文字列中の文字が占めるバイト数は一定していません。 Schemeの文字列プリミティブのセマンティクスは保たれているので、 詳細を気にしないでもプログラムは書けますが、 下にあげるいくつかの点を知っておいたほうが良いでしょう。
文字列オブジェクトは型タグと文字列本体へのポインタを保持しています。
文字列本体は「copy-on-write」方式で管理されます。すなわち、substring
や正規表現を使って部分文字列を切り出したり、あるいは単に文字列をコピーした場合、
文字列オブジェクトそのものは別につくられますが、文字列本体は共有されます。
文字列が破壊的に変更される場合にのみ、文字列本体がコピーされます。
したがって、make-string
である大きさの文字列をあらかじめアロケート
しておき、string-set!
で順に埋めて行くようなアルゴリズムは
Gaucheでは非常に効率が悪くなります。そのようなアルゴリズムは使わない方が良いでしょう。
(そのようなアルゴリズムはマルチバイト文字列とも相性が良くありません)。
文字列を順に埋めて行く場合はstring portsを使うのが
効率の良い方法です (文字列ポート参照)。
string-scan
(文字列を扱うその他の手続き参照) や正規表現
(正規表現参照) など文字列を検索するプリミティブは、
インデックスを介さずに一致した文字列を直接返すことができます。
Gaucheのコンパイル時に、文字の内部エンコーディングを選択することができます。
実行時に手続きgauche-character-encoding
を使うか、
コンパイル時に機能識別子(プラットフォーム依存の機能参照)を使うことで、
よってどの内部エンコーディングでコンパイルされたかを知ることが出来ます。
今のところ、以下のエンコーディングがサポートされています。
utf-8
UnicodeのUTF-8エンコーディング。これがデフォルトです。
Gaucheがこの内部エンコーディングでコンパイルされている場合は
機能識別子gauche.ces.utf8
が定義されます。
euc-jp
ASCII、JIS X 0201カナ、JIS X 0212及びJIS X 0213:2000文字集合のEUC-JP
エンコーディング。
Gaucheがこの内部エンコーディングでコンパイルされている場合は
機能識別子gauche.ces.eucjp
が定義されます。
sjis
JIS X 0201カナ及びJIS X 0213:2000文字集合のShift-JISエンコーディング。
ソースコードの互換性のため、文字コード0から0x7fの範囲はJIS X 0201 roman
ではなくASCIIにマップされます。
Gaucheがこの内部エンコーディングでコンパイルされている場合は
機能識別子gauche.ces.sjis
が定義されます。
none
8ビット固定長の文字エンコーディング。文字コード0から0x7fの範囲はASCIIと
みなします。文字列をどのエンコーディングとして解釈するかはアプリケーション次第です。
Gaucheがこの内部エンコーディングでコンパイルされている場合は
機能識別子gauche.ces.none
が定義されます。
他の文字エンコーディングからの変換は特別なポートを使って行われます。 文字コード変換 を参照して下さい。
ソースプログラムのエンコーディングを指定する方法については 次の章で説明します。
Next: マルチバイトスクリプト, Previous: 標準への準拠, Up: 主要な概念 [Contents][Index]