日本語を画面に出す
- 日本語は使えないDISPLAY命令もある
-
A−VXのCOBOLではDISPLAY命令で画面に文字を出すことができます。で、A−VXには「表示命令」のDISPLAY命令と、「画面制御機能」の「データ表示命令」のDISPLAY命令の2種類があることは、前に説明しました。
正式に日本語(2バイト文字)の表示に対応しているのは、「画面制御機能」の「データ表示命令」のDISPLAY命令の方だけみたいです。
NEC公式のCOBOL85の説明書上には、どこにも「表示命令」のDISPLAY命令で日本語表示ができるとは書いていない(できないとも書かれていませんが。)こと、逆に公式の説明書の1つである「COBOL85プログラミング手引書」の第9章 日本語情報処理機能」の「日本語データの画面入出力」には「画面制御機能」の「データ表示命令」のDISPLAY命令についての説明だけ書いてあること、から判断できます。
「COBOL85プログラミング手引書」から該当部分を一部抜き出し
日本語データを直接画面から入力、あるいは直接画面へ出力するには、日本語データ入力項目の設定、 日本語データ出力項目の設定、日本語データ入出力項目の桁位置の指定が必要です。 〜中略〜 画面データ記述項のPICTURE記述で、“N”を含むPICTURE文字列の出力項目を定義し、 DISPLAY命令で参照します。
私が良く書いている「表示命令」のDISPLAY命令を使った
DISPLAY "こんにちは世界"
のような書き方は、正確に言うと間違いということになります。
しかし実際には、上のような書き方をしたりしているプログラムが意外とあったりします。
これはDISPLAY命令とは関係ありませんが、COBOL74の流れで、
01 A PIC X(10) VALUE "こんにちは".
のように英数字項目に2バイト文字を入れていることも多かったりします。
- 実際に試してみる
-
そこで、実際に「表示命令」のDISPLAY命令で日本語(2バイト文字)を表示しようとしたらどうなるかを試してみたというのが、下の説明です。
「三谷」という文字を「表示命令」のDISPLAY命令で表示しようとするサンプルプログラム
試しに「三谷」という文字を表示してみます。(三谷といえば温泉で有名ですね。)
000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. TEST2. 000030 ENVIRONMENT DIVISION. 000040 DATA DIVISION. 000050 WORKING-STORAGE SECTION. 000060 01 N01 PIC N(20). 000070** 000080 PROCEDURE DIVISION. 000090 MPRG. 000100 DISPLAY "三谷". 000110 MPRGE. 000120 STOP "OK".
一応コンパイル・リンクができて、実行もできました。
なんとなく正しく表示できています。
日本語定数にしなければならない文字列を英数字定数として扱っているので、正確には間違いな記述です。
それじゃあ、ということで、今度は「刈谷」という文字を表示させてみましょう。
「刈谷」という文字を「表示命令」のDISPLAY命令で表示しようとするサンプルプログラム
000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. TEST2. 000030 ENVIRONMENT DIVISION. 000040 DATA DIVISION. 000050 WORKING-STORAGE SECTION. 000060 01 N01 PIC N(20). 000070** 000080 PROCEDURE DIVISION. 000090 MPRG. 000100 DISPLAY "刈谷". 000110 MPRGE. 000120 STOP "OK".
残念ながら、コンパイルでエラーになります。
正式にはこのような書き方は許されていないのだから仕方がないですね。
12 10 F C0009 文字定数/日本語定数の終わり方が誤っている 12 10 F C0031 日本語索引コード指定の利用者語が誤っている 12 10 F C0009 文字定数/日本語定数の終わり方が誤っている 12 10 F H0006 '谷'は定義されていない 13 11 W E0009 必要な終止符がない
ああ、NC"刈谷"にすればいいのね、と思った人もいるかもしれませんが、それも間違い。
000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. TEST2. 000030 ENVIRONMENT DIVISION. 000040 DATA DIVISION. 000050 WORKING-STORAGE SECTION. 000060 01 N01 PIC N(20). 000070** 000080 PROCEDURE DIVISION. 000090 MPRG. 000100 DISPLAY NC"刈谷". 000110 MPRGE. 000120 STOP "OK".
やっぱりコンパイルでエラーになります。
これは「出力命令」のDISPLAY命令が日本語文字に対応していないためです。
10 10 F J0063 DISPLAY 命令の作用対象が誤っている
いや項目定義してそれを表示すればイケるのでは?と頑張る人(昔の私だ!)もいるかもしれませんが、やっぱりコンパイルでエラーになります。
000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. TEST2. 000030 ENVIRONMENT DIVISION. 000040 DATA DIVISION. 000050 WORKING-STORAGE SECTION. 000060 01 N01 PIC N(20) VALUE NC"刈谷". 000070** 000080 PROCEDURE DIVISION. 000090 MPRG. 000100 DISPLAY N01. 000110 MPRGE. 000120 STOP "OK".
10 10 F J0063 DISPLAY 命令の作用対象が誤っている
実は抜け道があるそうで、最近教えてもらいました。
「'谷'は定義されていない」のように「〜は定義されていない」というエラーになったら、その前に「"」を付けるとコンパイルが通るらしいです。
これはDISPLAY命令に限らず、日本語(2バイト文字)定数を英数字定数として使おうとしてコンパイルエラーになったときに汎用的に使えるらしい。
000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. TEST2. 000030 ENVIRONMENT DIVISION. 000040 DATA DIVISION. 000050 WORKING-STORAGE SECTION. 000060 01 N01 PIC N(20). 000070** 000080 PROCEDURE DIVISION. 000090 MPRG. 000100 DISPLAY "刈"谷". 000110 MPRGE. 000120 STOP "OK".
コンパイル・リンクも問題なくでき、実行するとなんとなく正しい感じで動く。
とはいえ、コンパイラのバグ?チェック漏れ?を利用した裏技らしいので、A−VX COBOL85の文法的にはダメなものはダメということらしい。
正しくは下のように画面節を使ってくださいね、ということらしい。
000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. TEST2. 000030 ENVIRONMENT DIVISION. 000040 DATA DIVISION. 000050 SCREEN SECTION. 000060 SD GAMEN END STATUS ENDSTS. 000070 01 N01. 000080 10 LINE 10 COLUMN 10 PIC N(20) VALUE NC"三谷 刈谷". 000090** 000100 PROCEDURE DIVISION. 000110 MPRG. 000120 DISPLAY N01. 000130 MPRGE. 000140 STOP "OK".
特に裏技的なことをしないでも「三谷」も「刈谷」もちゃんと表示されます。
私の書き方も変なところがたくさんあるよということを書いておかないとまずいかなと思って書きました。あと”裏技”のことも書きたかったので。