導入
COBOLプログラムを記述していると、文字列の中に引用符そのものを含めたい場面に遭遇することがあります。例えば、誰かの発言をそのまま表示したい場合や、特定のメッセージを生成したい場合などです。もしこの引用符の扱い方を間違えると、コンパイルエラーの原因となったり、意図しない文字列が出力されたりして、プログラムの正常な動作を妨げます。本稿では、COBOLで文字定数内に引用符を含める際の、シンプルかつ確実なエスケープ方法について解説します。
基礎知識:COBOLにおける文字定数とエスケープ
COBOLでは、文字列リテラル(文字定数)は通常、二重引用符(”)で囲んで表現します。例えば、`MOVE “HELLO WORLD” TO WS-AREA.` のように記述します。
さて、この文字列リテラルの中に、さらに二重引用符そのものを含めたい場合はどうすればよいでしょうか。ここが今回のテーマである「エスケープ」の出番です。エスケープとは、特殊な意味を持つ文字を、その文字通りの意味として扱わせるための仕組みです。COBOLでは、文字定数内で二重引用符を表現したい場合、その二重引用符を2つ重ねて記述します。
例えば、`”He said “Hello””` のように記述したい場合、COBOLでは `MOVE “He said “”Hello””” TO WS-AREA.` のように記述します。最初の二重引用符は文字列の開始を、最後の二重引用符は文字列の終了を示します。そして、文字列の途中にある二重の二重引用符 `””` が、文字通りの二重引用符 `”` として解釈されるのです。
この「引用符を2つ重ねる」というエスケープ方式は、現代の多くのプログラミング言語でも採用されており、COBOLが初期の段階からこの直感的な方法を採用していたことは、当時の開発者にとって親切な仕様だったと言えるでしょう。
実装/解決策:引用符のエスケープ方法
文字定数内に引用符を含める具体的な手順は以下の通りです。
1. 文字列の開始と終了を定義する: 文字列全体を二重引用符(”)で囲みます。
2. 内包したい引用符を2つ重ねる: 文字列リテラルの中に、文字通りの二重引用符(”)を表現したい箇所があれば、そこで `””` と2つ重ねて記述します。
3. その他の文字はそのまま記述する: 文字定数として扱いたい他の文字は、通常通り記述します。
このルールに従うことで、COBOLコンパイラは、二重に重ねられた引用符を、単一の引用符として正しく解釈してくれます。
サンプルプログラム
実際に、引用符をエスケープした文字列を画面に表示する簡単なCOBOLプログラムを見てみましょう。
IDENTIFICATION DIVISION.
PROGRAM-ID. ESCAPE-QUOTE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-MESSAGE-1 PIC X(30).
01 WS-MESSAGE-2 PIC X(30).
01 WS-MESSAGE-3 PIC X(30).
PROCEDURE DIVISION.
MAIN-LOGIC.
- 例1: “He said “”Hello””” という文字列を格納
- 文字列リテラル内で引用符を表現するために “” を使用
MOVE “He said “”Hello””” TO WS-MESSAGE-1.
DISPLAY “Message 1: ” WS-MESSAGE-1.
- 例2: 引用符で囲まれた引用符 “This is a “”quote”” within a quote.”
MOVE “””This is a “”quote”” within a quote.””” TO WS-MESSAGE-2.
DISPLAY “Message 2: ” WS-MESSAGE-2.
- 例3: 引用符のみの文字列 “”
MOVE “””” TO WS-MESSAGE-3.
DISPLAY “Message 3: ” WS-MESSAGE-3.
STOP RUN.
このプログラムを実行すると、以下のような出力が得られます。
Message 1: He said “Hello”
Message 2: “This is a “quote” within a quote.”
Message 3: ”
ご覧のように、`””` と記述した箇所が、期待通り `”` として表示されていることがわかります。
応用・注意点
- シングルクォーテーション (‘) の扱い: COBOLでは、文字列リテラルをシングルクォーテーション(’)で囲むことも可能です。この場合、シングルクォーテーションをエスケープするには、同様に2つ重ねて `”` と記述します。例えば、`MOVE ‘He said ”Hello”’ TO WS-AREA.` のようになります。どちらの引用符を使うかは、プロジェクトのコーディング規約や、含めたい文字によって選択してください。
- 可読性への配慮: 引用符が多用されると、プログラムの可読性が低下する可能性があります。特に、ネストが深くなる場合などは、表示メッセージを別のデータ項目に定義し、そこでエスケープ処理を行う、あるいは、メッセージ生成ロジックを共通化するなどの工夫を検討すると良いでしょう。
- コンパイラ依存の可能性: 基本的には標準仕様ですが、ごく稀に、古いコンパイラや特定の環境では、エスケープ処理の挙動に微妙な違いが出る可能性もゼロではありません。もし意図した通りに動作しない場合は、お使いのコンパイラのドキュメントを確認することをお勧めします。
この「引用符を2つ重ねる」というシンプルなルールを覚えておけば、COBOLでの文字列操作がよりスムーズになるはずです。ぜひ、実際の開発で活用してみてください。

コメント