文字列操作   



  Mindでは 文字文字列 という2つの用語をはっきりと使い分けている。この違いをざっとみておこう。



 
 
文字
 
 

 まず、Mindでいうところの「文字」とは、独立した1つの文字のことを表す。そして、その1つの文字は、その文字に割り当てられた文字のコードとして評価される。つまり、最終的には、文字は数値と同じ扱いになる。
 例えば、ソースプログラムに以下のように書いた場合、
'A'
上記は、
65
と、数字を書いたのとまったく等価である。したがって、
'A'を 一文字表示する
というプログラムは、文字コードを直接の数値表現として、
65を 一文字表示する
あるいは、16進数表記を使って、
41Hを 一文字表示する
と記述することもできる。ただ後者の2つのように文字コードを直接記述したのではプログラムの意図が不明になってしまうので、'A' で表現する方が優れているのはいうまでもない。
 文字コードは数値と等価なので演算を行うことができる。次を参考にして欲しい。
    'A'に 3を 加えたものを 一文字表示する
 上のプログラムを走らせればスクリーンに D の文字が表示される。
    文字1が 'A' 以上 かつ 文字1が 'Z' 以下   (例1)         ならば ・・・・・・         つぎに
 または、
    文字1が 'A'から 'Z'の 範囲?          (例2)
 上記の2例はいずれも、変数「文字1」の値が半角英字の A〜Z であることを検査するものである。文字は数値と同じであることから、これを格納するのは、普通の整数変数(○○は 変数)で良い。(厳密には16ビットあれば足りるため、メモリ節約の目的で ○○は ワード変数 でも良い)。


 
 
文字列
 
 

 次に「文字列」であるが、これは複数の文字の連なりに付けられた名称である。
 「文字」は文字コードという数値によって一義的に特定されたが、「文字列」には、それに相当するような単独の数値はない。ただ、文字列を参照するために用いられる便宜上の値というものが存在する。それが文字列情報である。
 文字列はあくまでも集合であり、単独の文字ではないことに充分注意しなければならない。つまり、文字と文字列は次元の違う概念である。例えば、文字列に数値演算を施すことは無意味である。
    「こんにちは。」に 3を 加える
 上記は誤ったプログラムである。実際にコンパイルすればエラーになるだろう。
 文字はこれを連結して文字列に昇格できること、逆に、文字列を分解して文字に戻すことができるというように、両者の間を移行する手段が存在する。
 また、文字列を格納する変数についてはすでに第4章の「文字列変数」で述べたように、 「○○は 文字列実体」で定義する 文字列実体変数 と、 「○○は 文字列」で定義する 文字列情報変数 の2種類がある。



 
 
Mindでの漢字の取り扱い
 
 

 英数字(ASCII文字、半角)と漢字(全角文字)が混在した文字列は入出力やデータとしてごく普通に使われているが、一般的に、これをプログラムで処理しようとした場合にはいくつか注意すべき点がある。
 たとえば、文字列の先頭「1文字」を値として得たいとする。英数字なら文字列先頭の1バイトを取り出すだけの簡単なことだが、もしそれが漢字である場合、英数字と同じように1バイトを取り出したのでは、漢字コードの半分だけを得ることになってしまう。この問題を避けるため、たとえばUnicodeを使ってすべての文字を内部処理上は16bit長などに統一するといった対応をとっているプログラム言語もある。
 Mindでは、英数字/漢字が混在した文字列を、そのままの状態できれいに扱う工夫がされている。
 先に例としてあげた文字列の先頭の「1文字」を得る場合(Mindでは「左端文字」という処理単語)、内部で英数字/漢字の自動識別をおこない、英数字なら1バイトし、漢字なら2バイトを返すよう設計している。これにより、プログラマはその文字が英数字か漢字かの区別をまったく気にをせずに、論理的に正しい1文字を得ることができるようになっている。
 もちろん「先頭1文字」を得る場合に限らず、「n文字を得る(=部分文字列)」場合も、もっと言えば、「末尾の1文字を得る」(Mindでは「右端文字」)であっても同じであり、すべての文字列操作単語においてこの自動処理がおこなわれる。
 また文字列の中から部分文字列を検索する機能では、検索でヒットした位置を「バイト位置」ではなく「論理文字位置」で返すので、後続した処理(たとえば、ヒット位置から左の部分文字列を得るなど)をおこなうことはとても容易である。
 まとめると、Mindでの手法は「文字」という情報単位を、プログラム上あくまで論理的な1文字として扱えるよう (ちょうど、人が見て「1文字だ」と認識するのと同じにように)、すべての文字列処理機能が統一されている。


 
 
文字列を調べる機能
 
 

 文字列操作を行う単語は非常に多い。一見、覚えきれないほどあるように見えるが、単に組み合わせの数として多くなっているだけである。
 自動車を例にとれば、「左ハンドルか右ハンドルか」「ターボ付きか」「ボディーカラーは」といった組み合わせをしていくと、1つ1つは単純な要素であっても、結果的に多くのバリエーションができるのと似ている。
 次項から、主な文字列操作単語について機能面からグループ分けを行い、解説する。
注1
 以降の解説でのスタック仕様で、入力データが、<文字列変数> と示されているものは、文字列情報変数あるいは文字列実体変数の記述が強要されるものである。
 同様に、<文字列実体変数> とあるものは、文字列実体変数の記述が強要される(情報変数は操作できない)。
 また、下線のついた送り仮名は、強要される送り仮名である。下線の付かない送り仮名は例を示しているに過ぎず、省略することができる。
 第6章の「データの逆転介入」でも解説したように、データと変数のペアを指定するものでは、その2つを逆順に記述することができる。
    (例:「○○から △△を 検索する」/「△△を ○○から 検索する」)


 
文字コードを調べる単語
 

構文=
<文字>が 漢字コード? → <真/偽>
 与えられた文字(文字コード)が、漢字かどうか調べる。漢字であるかどうかの判断は、そのコードが 255よりも大きい...という簡単なものである。

構文=
<文字>が 空白? → <真/偽>
 文字が空白、カンマ、読点などの空白文字(区切り文字)であることを調べる。カンマ/読点は、半角/全角のどちらでもよい。また、半角空白(十六進で20H)未満の、いわゆる制御コードも空白とみなす。

構文=
<文字>が 数字? → <真/偽>
 文字が有効な数字(半角または全角の'0'〜'9')であることを検査する。

記:このほか「漢字第一バイト?」という単語もあるが、上級向け編で解説する。


 
文字列を調べる単語
 

構文=
<文字列> 文字数  → <文字数> <文字列> バイト数 → <バイト数> <文字列>が 空列?  → <真/偽>   注:データを明記する場合には送り仮名「の」が強制される   注:「バイト数」は「バイト数を得る」も同じ動作をする
 「文字数」は、指定された文字列の文字数を返す。
 文字数は論理的にカウントされる。すなわち、2バイト系の漢字コードがあった場合、その2バイトで1文字としてカウントする。
 「バイト数」は、指定された文字列のバイト数を返す。名前が示す通り、物理的なバイト数をカウントする。
「東京ABC」の 文字数  → 5 「東京ABC」の バイト数 → 7
 通常は「文字数」を使うことが多いが、文字列の物理的長さ(たとえばメモリ上で消費するサイズ)を測るには「バイト数」を使う必要がある。また、同様の意味だが、その文字列をスクリーンなどに表示した場合の表示領域長さ(半角換算の表示桁数)も「バイト数」が合っているだろう。
 「空列?」は、文字列が空列(長さゼロ)であることを検査する。ある文字列に繰り返して処理を施す場合、打ち切りの判定によく用いられる。


 
文字列実体変数を調べる単語
 

構文=
<文字列実体変数>の 長さ  → <バイト数> <文字列実体変数>の サイズ → <バイト数> <文字列実体変数>の 追加余裕   → <バイト数> <文字列実体変数>の 左側追加余裕 → <バイト数>   注:文字列実体変数名および送り仮名「の」記述が強制される
 「長さ」は、文字列実体変数を定義したときの「長さ」を整数値として得るものである。(コンパイル時に確定する値である)
 たとえば、
住所は 文字列実体 長さ 200桁。
として文字列実体が定義されていて、その先のプログラムで、
Aの バイト数を得て 住所の 長さより 大きい     ならば ・・・エラー処理・・・
と書いたとき、「住所の 長さより 大きい」 の箇所は、ここに 「200より 大きい」 と数値を書いたのと同じに扱われる。上記では、格納しようとするAという文字列の長さ(バイト数)が、格納先の文字列実体変数の容量を超えているかどうかの判別をしようとしている。
 「サイズ」は、文字列実体変数そのものがメモリ上に占めるバイト数を参照するものである。先の「長さ」と似ているが、「長さ」より8バイト大きい。(8バイトは文字列実体変数のヘッダ部長さである)
 「追加余裕」は、文字列実体の格納余裕を知るものである。その時、文字列実体変数が空の状態であれば「長さ」と同じ値が返され、何らかの文字列が格納済みであれば、その分だけ少ない値が返される。つまり、「満杯までにあとどのぐらい余裕があるか」を知るための処理単語である。
 この単語は多くの場合、後続する「追加」操作に先立って、さらに文字列が追加できるかどうかの判定に多く使われる。
 なお、文字列実体の格納余裕についは、「左寄せ、右寄せ」のセクションでも触れているため合わせて参照して欲しい。


 
文字列同士を比較
 

構文=
<文字列1>と <文字列2>が 等しい文字列? → <真/偽>
 2つの文字列が等しいことを検査する。小文字/大文字、半角/全角などの違いは、違うものとして処理される。

構文=
<文字列1>と <文字列2>を 文字列比較する → <結果(整数値)>                     結果:0  文字列1=文字列2                     結果:1  文字列1<文字列2                     結果:2  文字列1>文字列2
 先の「等しい文字列」と似ているが、文字列の大小も含めて比較したい場合にこれを用いる(等しいことを調べるだけなら、「等しい文字列」の方が高速)。
 ここでいう大小とは、文字コードとして見た場合の大小である。比較の方法は、それぞれの文字列の左端文字から始めて、論理1 文字ずつ切り出し、それを比較するという方法によっている。2つの文字が異なれば、そこで比較を終了し、同じコードであれば、さらに次の文字について調べ、違いが見つかるまで処理を繰り返す。
 半角英数文字と漢字が混在していてもうまく処理する。漢字は2バイトを一度に得るので、当然ながら、半角英数文字よりも大きな値として判断する。


 
文字・文字列を検索
 

構文=
<対象文字列>から <検索文字>を 一文字検索 → <位置> <対象文字列>から <検索文字列>を 検索   → <位置>   注:返される<位置>は整数で1から数え、先頭でヒットすれば1が返される。     ノーヒットなら<位置>は0となる。   注:対象文字列と検索文字(列)は逆順に書くこともできるが、そのためには     送り仮名を正しく書く。「から」は「より」,「を」でも可、 「を」は「で」でも可。
 「一文字検索」は、指定した文字列中から指定した1文字を検索し、見つかれば、その文字の位置(左端を1と数える)を返す。見つからない場合には0を返す。
 「検索」は、検索キーが文字列である点を除けば「一文字検索」と同じである。もし検索キーが1文字だけなのであれば、1文字の文字列をキーとせずに、1文字キー専用の「一文字検索」を使用されたい。
 例えば、
'A'を 〜〜から 一文字検索する   ←文字を検索 "A"を 〜〜から 検索する      ←文字列を検索(ダブルクオートは文字列定数)
 上記の2つはどちらも同じ結果が返されるが、このような1文字の検索は、できれば前者の「一文字検索」を勧める。また前者の方が高速でもある。
後者のケース(1文字だけの検索キーを指定して「検索」すること)では、対象文字列の中に漢字が含まれると、漢字コードの第2バイト目を拾って誤動作することがある。「一文字検索」ではそのような誤動作はない。なお、「検索」であっても、長さ2文字以上の検索キーを指定するならこのような誤動作はない。


 
 
文字・文字列を置換する
 
 


 
文字・文字列を数値に変換
 
(整数向け)

構文=
<文字>を  一文字数値変換 → <数値> <真/偽> <文字列>を 数値変換    → <数値> <真/偽>
 「一文字数値変換」は、文字が有効な数字であれば、そのバイナリ値と真偽(1または0)を返す。有効な数字とは半角または全角の'0'〜'9'である(全角でも良いことに注目)。
 たとえば、文字としての'1'を「一文字数値変換」すると、スタックには数字の1と真(=1)の2つが積まれて戻ってくる。
 「数値変換」は、文字列を丸ごと処理し、それと等価なバイナリ値と真偽を返す。
 たとえば、文字列としての "123" を「数値変換」すると、スタックには数字の123と真(=1)の2つが積まれて戻ってくる。
 文字列の頭には、符号を表す '-' あるいは全角であれば '−' を付けることができる。
 これらの処理単語は、2つのデータをスタックに返すので、次のプログラム例のように、得られたデータを局所変数に入れるとよいだろう。
○○とは         金額は 変数         合否は 変数     ・・・を (一文字)数値変換し 金額と 合否に 入れ     合否が 真?         ならば 金額を ・・・し             ・・・・・・・・し         つぎに
(小数向け)

構文=
<文字列>を 数値変換・小数 → <小数値> <真/偽> <文字列>を 小数表記が有れば数値変換       (小数表現の場合)   → <小数値> <真/偽> 1       (小数表現でない場合) → 0
 小数向けの 文字列→数値 の変換には上記のように2つのタイプが利用できる。
 まず、「数値変換・小数」は、整数版の「数値変換」と同じように、文字列を与えること、変換結果の小数値および、正しく変換できたかどうかの真偽をスタックに返す。失敗したときの小数値は 0.0 である。
 注意するのは、与えられる”数値を表す文字列”が整数の場合、強制的に小数値を変換結果として返す点である。たとえば、文字列として「123.0」を与えても、「123」を与えても、いずれも結果は小数値となり 123.0 である。
 後者の「小数表記が有れば数値変換」は、与えられる文字列が小数表現の場合にのみ小数値に変換するものである。もし与えられる文字列が整数を表す場合にはスタックに0を1つ積んだだけで帰る。
 この処理単語は、たとえばキーボードなど外部から文字列を入力したようなケース、つまり、整数を表す文字列なのか小数を表す文字列なのかが実行時にならないと判別できないようなケースで使われ、入力された文字列が整数表現なのかと小数表現なのかで処理を変えたい場合に利用すると良いだろう。
 なお、与えられる文字列が小数表現ではあるものの、正しくない形式の場合、たとえば、
3.1.4 3.14E+-3 3.14p6
のような場合は、”小数表現があった”として処理がおこなわれ、「しかしそれが失敗した」ものとして扱われる。つまり、スタックには 0.0、 0、 1 の3値が返される。


 
数値を文字・文字列に変換
 
(整数向け)

構文=
<数値>       文字変換       → <文字> <数値>       文字列変換      → <文字列情報>  注1、注2 <数値> <桁数>で 桁数指定で文字列変換 → <文字列情報>  注1、注2 <数値> <桁数>と <文字>で       桁数と満たす文字指定で文字列変換 → <文字列情報>  注1、注2    注1:変換結果を生成する文字列実体変数として暗黙の変数「変換文字列」が使われ、         そこを指す文字列情報がスタックに返される(元文字列は影響を受けない)    注2:変換結果を生成する文字列実体変数を明示することもできる。上級編で解説する
 「文字変換」は、与えられた数値(0〜15)を対応する1文字(の文字コード)に変換して返す。たとえば、0を与えると '0'という文字コードが返される。10〜15の範囲の値を与えた場合には十六進数への変換がおこなわれ、'A'〜'F'を返す。
 「文字列変換」は、与えられた数値を文字列に変換する。例えば、100 という数値を与えることで、 "100" という文字列を得ることができる。
 次のプログラム例は2種類の数値を前記した3つの処理単語を使って画面に表示するものである。
 (プログラム)
メインとは     123を 文字列変換し 一行表示し     123を 10桁で 桁数指定で文字列変換し 一行表示し     123456を 10桁で 桁数指定で文字列変換し 一行表示し     123456を 10桁と ':'で 桁数と満たす文字指定で文字列変換し 一行表示し
 (実行結果)
123 ←文字列変換 123 ←桁数指定で文字列変換 123456 ←桁数指定で文字列変換 ::::123456 ←桁数と満たす指定で文字列変換 ←-10桁--→
 生成される文字列は、「変換文字列」という名前の文字列実体に生成され、スタックにはそこを示す文字列情報が返される仕組みになっている。
 生成される文字列の桁数は、与える数値によって異なる。例えば、0 を与えれば、1桁の”0”だけが生成され、大きい値なら桁数も大きくなる。
 「桁数指定で文字列変換」は文字通り、変換結果の桁数を指定するものである。指定桁数に満たない部分を半角空白(0x20)で埋め、必ず指定桁数の文字列を生成する。数値を表示する際に、体裁として表示位置を揃えたい場合に用いられる。
 「桁数と満たす文字指定で文字列変換」は、指定桁数に満たない部分に半角空白ではなく、指定した文字を埋める機能である。
 なお、上級者向けの同様の機能として、16進数に変換するための、「文字列変換・ニブル」「文字列変換・バイト」「文字列変換・ワード」「文字列変換・ダブル」がある。バイナリ値を1桁から8桁の16進の文字列に変換する。

(小数向け)

構文=
<小数値>を <全桁数>と <小数桁数>で 文字列変換・小数形式 → <文字列情報> <小数値>を <全桁数>と <小数桁数>で 文字列変換・指数形式 → <文字列情報>   注:<全桁数> はゼロを指定すると、最小限必要な桁数が適用される   注:変換結果を生成する文字列実体変数として暗黙の変数「変換文字列」が使われ、       そこを指す文字列情報がスタックに返される(元文字列は影響を受けない)   注:変換結果を生成する文字列実体変数を明示することもできる。上級編で解説する
 上記は小数値を、それに相当する文字列に変換する処理単語である。前者はあえて(多くの場合、見やすくするために)固定小数として変換するもの、後者は元来の浮動小数形式(指数形式)で変換するものである。
 次のプログラム例は小数値 1.23 を、前記した2つの処理単語を使ってそれぞれ画面に表示するものである。

   [B1]   
メインとは         値は 小数変数     1.23を 値に 入れ  (小数形式での表示)     値を 0桁と 5桁で 文字列変換・小数形式し     「[」を 表示してから 表示し 「]」を 一行表示し     値を 20桁と 5桁で 文字列変換・小数形式し     「[」を 表示してから 表示し 「]」を 一行表示し  (指数形式での表示)     値を 0桁と 5桁で 文字列変換・指数形式し     「[」を 表示してから 表示し 「]」を 一行表示し     値を 20桁と 5桁で 文字列変換・指数形式し     「[」を 表示してから 表示し 「]」を 一行表示すること。
[1.23000] [ 1.23000] [1.23000e+000] [ 1.23000e+000] ←-------20桁-------→


 
文字・文字列を大文字に変換
 

構文=
<文字>を 一文字大文字変換 → <文字> <文字列実体変数> 大文字変換 → ・
 「一文字大文字変換」は、与えられる文字が'a'から'z'の場合(半角でも全角でも)、これを大文字の'A' から'Z'に変換して返す機能である。(半角なら半角として、全角なら全角として変換)
 「大文字変換」は、明に指定した文字列実体変数を丸ごと大文字に変換する。文字列実体変数に対して副作用を与える方法をとり、スタックは空で帰る。


 
文字列を小文字に変換
 

構文=
<文字列実体変数> 半角小文字変換 → ・ <文字列実体変数> 小文字変換 → ・
 「半角小文字変換」は、明に指定した文字列実体変数に含まれる半角大文字 'A'〜'Z' を(半角のみが対象)、半角大文字の 'a'〜'z' に変換する。文字列実体変数に対して副作用を与える方法をとり、スタックは空で帰る。
 「小文字変換」は、明に指定した文字列実体変数に含まれる半角または全角の大文字 'A'〜'Z' を半角/全角を維持しながら小文字の 'a'〜'z' に変換する。文字列実体変数に対して副作用を与える方法をとり、スタックは空で帰る。


 
文字コードの変換
 

構文=
    (1文字の変換) <文字>を 一文字JIS→EUC変換  → <文字> <文字>を 一文字SJIS→EUC変換 → <文字> <文字>を 一文字EUC→SJIS変換 → <文字> <文字>を 一文字EUC→JIS変換  → <文字>     (ShiftJIS←→EUCの変換) 注1、注2 <文字列>を SJIS→EUC変換 → <文字列> <文字列>を EUC→SJIS変換 → <文字列>     (JISコードとの変換)    注1、注2 <文字列>を SJIS→JIS変換 → <文字列> <文字列>を EUC→JIS変換  → <文字列> <文字列>を JIS→SJIS変換 → <文字列> <文字列>を JIS→EUC変換  → <文字列>    注1:変換結果を生成する文字列実体変数として暗黙の変数「変換文字列」が使われ、         そこを指す文字列情報がスタックに返される(元文字列は影響を受けない)    注2:変換結果を生成する文字列実体変数を明示することもできる。上級編で解説する


 
 
文字列の操作
 
 


 
文字列の左右端の文字を得る
 

構文=
<文字列>の 左端文字 → <文字> <文字列>の 右端文字 → <文字> <文字列変数>から 一文字切り出し   → <文字>   (注) <文字列変数>から 一文字右側切り出し → <文字>   (注)    注 ・副作用を受ける文字列情報変数または文字列実体変数の明示が必要。       ・その変数名に送り仮名が必須で上記「から」のほか「より」、「を」でも可。
 「左端文字」、「右端文字」は、指定する文字列の左端または右端の文字を参照する。それが漢字の場合は一度に2バイトを読み取り、最大16ビットの整数として返すので、ユーザーが特別に漢字を考慮する必要はない。
 文字列が空列の場合には左端も右端もどちらの文字も参照できないが、この場合はゼロが返される。
 「一文字切り出し」、「一文字右側切り出し」は、「左端文字」「右端文字」とよく似ているが、取り出した後に変数に副作用を与える点が異なる。すなわち、読み取った文字は、読み取りと同時に削除され、元の文字列は縮小される(ファイルの読み出し操作と似ている)。
 この切り出し機能は、Mindでは非常に多く使用される。文字列を与えられたとき、これから1文字ずつ、あるいは数文字ずつ切り出し、これを繰り返すことで、文字列を構成する全部の文字に対して、ある処理を施すという場合に用いられる。
文字列から1文字ずつ順に取り出す方法として、他のプログラム言語では、「文字列からn番目の文字を取り出しす」ことをベースとし、そのnを順次大きくしていく方法をとるものが多い。Mindでももちろんそのような記述も可能(「指定位置の文字」)ではあるが、Mind的ではない。与えられた文字列の端から1文字ずつ「かじり取っていく」つまり切り出していくこの方法を覚えてほしい。
上級者向けの機能として、「左端バイト」「右端バイト」「一バイト切り出し」「一バイト右側切り出し」という単語群もある。漢字処理を避けたり、バイナリブロックを扱うために用いられる。詳しくは上級編を参照されたい。

 
文字列の左右端の部分文字列を得る
 

構文=
<文字列>から <文字数>だけ 取り出し     → <文字列> <文字列>から <文字数>だけ 右側取り出し   → <文字列> <文字列変数>から <文字数>だけ 切り出し   → <文字列>   (注) <文字列変数>から <文字数>だけ 右側切り出し → <文字列>   (注)    注 ・副作用を受ける文字列情報変数または文字列実体変数の明示が必要。       ・その変数名に送り仮名が必須で上記「から」のほか「より」、「を」でも可。       ・2つのデータは逆順表記も可(<文字数>だけ <文字列変数>を 切り出し)。
 「取り出し」、「右側取り出し」は、指定する文字列の左端または右端から指定文字数だけ参照する機能である。
 文字数は論理文字数として解釈される。つまり、これはバイト数ではなく、論理的な正しい文字数(漢字は 2バイトを1文字として数える)である。
 指定した文字数に足りない場合には、ある分だけが返される(元から空列の場合には空列が返される)。
 後半の2つ、「切り出し」「右側切り出し」は、前半の2つとよく似ているが、変数に副作用を与える点が異なる。すなわち、読み取った文字列は、読み取りと同時に削除され、元の文字列は縮小される(ファイルの読み出しと似た操作である)。
 例えば、ある文字列変数に次のような値が格納されているとき、
神奈川県横浜市・・区・・町・・
 文字数=4で「切り出し」することで、先頭4文字とそれ以降 に分割することができる。
 具体的には、この処理単語の実行によりスタックには「神奈川県」が返され、元の文字列は縮小して「横浜市・・区・・町・・」が残ることになる。
     |→「横浜市・・」以降が文字列変数に残る 神奈川県 横浜市・・区・・町・・   「神奈川県」が切り出されてスタックに返される
上級者向けの機能として、「バイト列取り出し」、「バイト列右側取り出し」、「バイト列切り出し」、「バイト列右側切り出し」がある。これらは文字数ではなく物理的なバイト数を指示するもので、バイナリーデータなど、漢字処理の介入を避けたい場合に用いられる。詳しくは上級編を参照されたい。

 
文字列を分断する
 

構文=
<文字列変数>を <文字位置>で 分断し   → <文字列>    注 ・副作用を受ける文字列情報変数または文字列実体変数の明示が必要。       ・その変数名に送り仮名が必須で上記「を」のほか「から」、「より」でも可。       ・2つのデータは逆順表記も可(<位置>で <文字列変数>を 分断)。       ・文字位置は整数で1から数える。先頭文字が1。
 文字列の中の特定の文字位置で文字列を分断する機能である。
 例えば、ある文字列変数に次のような値が格納されているとき、
神奈川横浜市・・区・・町・・
 '県'の文字の箇所で、文字列を左右に分断したい場合、上記では文字位置として4を指定することで、元の文字列を 県の左側(=県名)それ以降 に分断することができる('県'が消えることに注目!)。
 具体的には、「分断」の実行によりスタックには「神奈川」が返され、元の文字列には「横浜市・・」以降が残ることになる。
     |→「横浜市」以降が文字列変数に残る 神奈川横浜市・・区・・町・・   「神奈川」が切り出されてスタックに返される
 機能的には、「切り出し」と良く似ているが、指定した位置にある文字が消滅するかどうかの違いがある。
 なお、この「分断」に与える文字位置を得るのに「一文字検索」と相性がよいことを覚えておきたい。上の例であれば、
住所解析とは (住所 → ・)         住所は 文字列         県名は 文字列     住所に 入れ     住所から '県'を 一文字検索し 位置に 入れ     位置が ゼロ以外         ならば 位置で 住所を 分断し 県名に 入れ         つぎに     〜略〜
 のよように、一文字検索を使って'県'を検索し、その結果得られる位置(このケースでは3)を「分断」に与えればよいのである。


 
単語を切り出す
 

構文=
<文字列変数>から 単語切り出し → <文字列>    注 ・副作用を受ける文字列情報変数または文字列実体変数の明示が必要。       ・その変数名に送り仮名が必須で上記「から」のほか「を」、「より」でも可。       ・元の文字列は切り出した分だけ縮小する(続いて同じ操作ができる)。
 英語の文章のように、文字列が空白などを挟んだ複数の単語から構成されている場合、その単語を切り出す機能である。少し前に解説した「切り出し」と同じように元の文字列変数は副作用を受け、切り出した分だけ削減される。つまり続けて何度も同じ操作を行うことで、次々と単語を取り出すことができる。
 この「単語切り出し」は次のような手順で行われる。
 「単語切り出し」は、空白などで区切られていれば、英語/日本語のあらゆるテキストに適用できる。例えば次のようなテキストである。
(テキスト例) DIR A: /W 東京都 港区 南青山 とうきょう、 なごや、 おおさか、 ふくおか ↑カンマ、読点、タブの区切りも可
 上のような文字列に対して、繰り返して「単語切り出し」することで、1つ1つの単語をきわめて容易に得ることができる。1行目(DIR A: ・・)の例であれば、最初の単語切り出しで、"DIR" が選られ、次の単語切り出しで "A:" が得られる。
 なお、単語間の 空白文字として認識する文字 であるが、本来の空白のほかに、カンマ、読点(ここまで半角・全角どちらも)、タブなど多くの記号が対象となる。詳細は処理単語「空白?」の解説を参照されたい。
 次に示すのは「単語切り出し」を使うプログラムの例である。
単語に分解して表示とは (文字列 → ・)         文字列1は 文字列         単語は   文字列     文字列1に 入れ     ここから         文字列1から 単語切り出し 単語に 入れ         単語が 空列?             ならば 打ち切り             つぎに         「単語=」を 表示し 単語を 一行表示し     繰り返すこと。 メインとは 「とうきょう、 なごや、 おおさか、 ふくおか」を 単語に分解して表示すること。
 与えられた文字列からすべての単語を取り出しして何か処理する‥という処理はおおむねこのようになるので参考にして欲しい。
 なお、上のプログラムでループの脱出条件として「単語が 空列?」を用いていることに注目して欲しい。
 文字列を少しずつ切り出していくループは、通常であれば「文字列1が 空列?」を使うことが多いのだが、こと単語切り出しに関しては、切り出した単語が空列であるかを調べるほうが良い。
 なぜなら、たとえば「あ い う  」(←末尾に空白!)というような文字列を与えた場合、最後の単語「う」を切り出したあと、まだ文字列1は空列になっておらず(空白が2つ残っている)、もし「文字列1が 空列?」を脱出判定とすると、最後に空の単語を取り出すことになってしまうからである。
 上のプログラムを実行すると下記のような結果となる。
>obj¥単語に分解して表示
単語=とうきょう
単語=なごや
単語=おおさか
単語=ふくおか



 
文字列を削除する
 

構文=
<文字列変数>を 一文字削除   → ・ <文字列変数>を 一文字右側削除 → ・ <文字列変数>を <文字数>だけ 削除   → ・  (注) <文字列変数>を <文字数>だけ 右側削除 → ・  (注)    注 ・副作用を受ける文字列情報変数または文字列実体変数の明示が必要。       ・その変数名に送り仮名が必須で上記「を」のほか「から」、「より」でも可。       ・元の文字列は削除した分だけ縮小する(続いて同じ操作ができる)。
 いずれも、指定する文字列変数に副作用を与えることで削除を行う単語である。
 空の文字列に対して適用しても、無視されるだけであり異常は起こらない。
 この機能は、文字列変数のヘッダ情報を更新するだけであり、実際に文字列の実体を削除するわけではないため高速である。
 「削除」、「右側削除」は、文字数を指定するが、この文字数は論理的文字数であり、漢字であっても1文字として数えるようになっている。
 文字列変数に格納されている文字数を超えて「削除」しようとした場合、「ある分だけ」が削除され、異常は起こらない。
上級者向けの機能として、「一バイト削除」、「一バイト右側削除」「バイト列削除」、「バイト列右側削除」がある。これらは文字数ではなく物理的なバイト数を指示するもので、バイナリーデータなど、漢字処理の介入を避けたい場合に用いられる。詳しくは上級編を参照されたい。


 
文字列変数をクリアする
 

構文=
<文字列変数>を クリアする   → ・  (注)    注 ・副作用を受ける文字列情報変数または文字列実体変数の明示が必要。       ・その変数名に送り仮名が必須
 その文字列変数に空列を格納するのと結果的に同じである。文字列実体変数であればそのヘッダ部8バイトが、文字列情報変数であればそのすべて(やはり8バイト)がクリアされる。


 
空白を除く
 

構文=
<文字列変数>の 空白を除く    → ・  (注) <文字列変数>の 右側の空白を除く → ・  (注)    注 ・副作用を受ける文字列情報変数または文字列実体変数の明示が必要。       ・その変数名に送り仮名「を」または「の」が必須
 文字列の左側あるいは右側にある空白文字を削除する。
 空白文字として認識する文字 であるが、本来の空白のほかに、カンマ、読点(ここまで半角・全角どちらも)、タブなど多くの記号が対象となる。詳細は処理単語「空白?」の解説を参照されたい。


 
左寄せ、右寄せ
 

構文=
<文字列実体変数>を 左寄せ    → ・  (注) <文字列実体変数>を 右寄せ    → ・  (注) <文字列実体変数>を <バイト数>だけ 少し左寄せ → ・  (注) <文字列実体変数>を <バイト数>だけ 少し右寄せ → ・  (注)    注 ・副作用を受ける文字列情報変数または文字列実体変数の明示が必要。       ・その変数名に送り仮名「を」または「の」が必須
 ワープロソフトなどで、「左寄せ」「右寄せ」という機能があるが、それと似たような概念である。ワープロの場合には、「表示域上で文字列を左右端に寄せる」のに比べ、本機能は、文字列実体変数の内部に格納されている文字列を寄せるため、変数内に格納されている文字列の実体の移動をおこなう。
 すでに述べたように、文字列実体変数は、文字列の実体を格納する容器である。実際に格納されている文字数は、その容量に比べて小さいことが普通で、つまり、容器の中には空きができている。普通の状態では左寄せで格納されているので右側が空いており、これを「右寄せ」することができる。(結果的に左側に空きができる)
 その右寄せをした場合だが、外目にはその文字列は何ら変化がない。例えば「東京」という文字が格納されているとき、これを右寄せしても、依然として変数を参照した値は「東京」である。
 右寄せの目的は、左側に空きを作ることにある。後述する「一文字左側追加」あるいは「左側追加」によって、文字列を左側に成長させる場合、左側が空いている必要があるため、このような操作が必要になる。
 一方、左寄せの場合、「削除」などの後続処理として使われることが多い。「一文字削除」や「削除」は、文字列の左側部分を削除するので、左側に空きができる。これを詰めて右側をより多く空けるのに左寄せが使われる。文字列実体変数に対して、「削除」(左側を削除)と、「追加」(右側に追加)することを数多く繰り返すするようなケースで必要になることがある。
 「少し左寄せ」「少し右寄せ」は、指定バイト数(論理文字数ではない)だけ左右に寄せる機能である。


 
空白を満たす
 

構文=
<文字列実体変数>に 空白を満たす → ・    注 ・副作用を受ける文字列情報変数または文字列実体変数の明示が必要。       ・その変数名に送り仮名「に」が必須
 文字列実体変数の空き領域(左側および右側)に半角空白文字を満たす機能である。結果として、その文字列実体の長さ一杯に文字が埋まることになる。


 
文字・文字列の追加
 

構文=
<文字列実体変数>に <文字>を 一文字追加   → ・ <文字列実体変数>に <文字>を 一文字左側追加 → ・ <文字列実体変数>に <文字列>を 追加   → ・ <文字列実体変数>に <文字列>を 左側追加 → ・    注 ・副作用を受ける文字列情報変数または文字列実体変数の明示が必要。       ・その変数名に送り仮名「に」が必須。「へ」でも可。
 指定する文字または文字列を、指定する文字列実体変数(必ず実体変数を指定)に追加する。
 この追加関係の単語群に限り、暗黙の操作場所が右側にとられている。すなわち単に「追加」といった場合には右側へ追加を指す。他の文字列操作単語では(例えば「削除」)特に左右を示さない場合、左側を操作するのでこの違いに注意したい。
 操作を受ける文字列実体変数は追加分の余裕がなくてはならない。特に「左側追加」は注意しなければならない。普通の状態では文字列実体変数の左側は空いていないからである。その場合、「右寄せ」「少し右寄せ」などの前処理 が必要となる。
 追加余裕が不足しているのに追加をした場合は、追加できる分だけ追加されるようになっている。また、漢字の追加も安全に行われる。たとえば3バイト空いている状態で2文字の漢字(4バイト)を追加しようとした場合、最初の1字のみが追加される。


 
文字列の簡易な合成
 
 前項に解説した「追加」機能は、文字列実体変数に文字や文字列を追加していくことで、結果的に長い文字列を合成する目的で使われるが、それとは別の方法として、より簡易に、スタックから渡された2つあるいはそれ以上の数の文字列を合体・合成するような機能について解説する。

構文=
<文字列1>と <文字列2>を 合成 → <文字列>
 2つの文字列をライブラリ内部の文字列実体変数上に合成し、その文字列情報をスタックに返す。
 合成すべき2つの文字列はスタック渡しで良い。
 ライブラリ内部に4本分の合成用の文字列実体が確保されており、それらが循環して使用されるようになっている。つまり、連続して4回まで独立した文字列を合成することができる。
 なお、合成用のライブラリ内変数は2048バイト(全角なら1024文字分)以下でなくてはならない。これを超えた合成をおこなうとすると多くの場合、後のほうの文字列が尻切れになる(特にエラーは検出されない)。
 2個を超えた文字列の合成をおこないたいときや、ループ処理で「次々と文字列を合成していく」ときのために以下の処理単語も利用できる。


構文=
<最初の文字列>を 第一合成文字列設定 → ・ <次の文字>を  さらに一文字合成 → <文字列> <次の文字列>を さらに合成    → <文字列>
 3個以上の文字列を合成するための単語群である。
 まず、「第一合成文字列設定」によって最初の文字列(この段階では空列を渡しても良い)を登録し、以下、これに対して「さらに合成」あるいは「さらに一文字合成」(文字を追加する場合)を繰り返せばよい。
 「さらに合成」系を続ける限りは、初回に獲得した文字列実体が固定的に使用され、循環バッファが次に進むことはないため、「連続4回まで」の制約を気にせずに合成できる。
 例として、「苗字」と「名前」という2つの文字列変数に格納されている文字列を空白を挟んで合体し、フルネームで返す単語定義を、 A:普通に文字列実体変数への追加で実現する方法 と、 B:合成を使う方法  の両方で書いた例を示す。

   [A]   
フルネームは 文字列実体 長さ 80桁。 フルネームを合成とは (苗字、名前 → 文字列)         苗字は 文字列         名前は 文字列     苗字と 名前に 入れ     苗字を   フルネームに 入れ     全角空白を フルネームに 一文字追加し     名前を   フルネームに 追加し     フルネームを 返すこと。

   [B]   
フルネームを合成とは (苗字、名前 → 文字列)         苗字は 文字列         名前は 文字列     苗字と 名前に 入れ     苗字を   第一合成文字列設定し     全角空白を さらに一文字合成し 捨て     名前を   さらに合成すること。
前記した合成機能はあくまで簡易的なものである。たとえば4回を超えて合成を行うと最初の合成値が(オーバーラップにより)破壊されるなど制限がある。
堅固なプログラムにするには、この機構は使わずに、自前で文字列実体変数を用意して「追加」「一文字追加」などを使って普通に合成をおこなうのが望ましい。