【COBOL 読み1-21】デブとCOBOLとカタカナと

🧩今日の学び
・COBOLでは“文字が化けないかどうか”が設計判断の最優先になる
・昭和ホストのEBCDIC〜令和のUTF-8まで、環境で使える文字種が変わる
・本番帳票は1文字のバイト数ズレが致命傷になるため、今でもASCII優先文化が残る

今日のコード

       WRITE-ERROR.
           ADD 1 TO TOT-ERR
           STRING IN-REC DELIMITED BY SIZE
                  ","    DELIMITED BY SIZE
                  WS-MSG DELIMITED BY SIZE
           INTO ERR-REC
           END-STRING
           WRITE ERR-REC.

       WRITE-REPORT-HEADER.
           MOVE SPACES TO OUT-REC
           STRING
              "=== DAILY SALES REPORT ===  "
              DELIMITED BY SIZE
              "Generated: "
              DELIMITED BY SIZE
              CD-YYYY "::" CD-MM "::" CD-DD
              DELIMITED BY SIZE
              "  " CD-HH ":" CD-MN ":" CD-SS
              DELIMITED BY SIZE
           INTO OUT-REC
           END-STRING
           WRITE OUT-REC.
           MOVE "----------------------------------------------"
             TO OUT-REC
           WRITE OUT-REC.
           MOVE "DETAILS:" TO OUT-REC
           WRITE OUT-REC.

なるお)もうこの程度なら簡単タンシチュー!

毎回毎回おんなじようなコード見せてくるとか、おじいちゃんはほんとしつこいよね。

係長)なんかいったか?

な)いや…今日もよろしくお願いします、師匠…という気持ちとか、そうでもない気持ちとか。
あ、アイス食います?

係)なんで、仕事中にアイス食ってんだよ。

な)だって、食べたいときが食べ時じゃないですかー。食べ時を逃すと食い逃すかもしれないじゃないですかー。

欲しがりません!焼き野菜!

でもライスは必要ですよ?ライスは野菜じゃないですし、肉5ライス5ぐらいでいきますよ。

だって、大盛りライスのほうが中盛ライス2つより安いんですよ?大盛りライス2つのほうが中盛ライス4つよりやすいんですよ?

係)だから太ってんだな。

な)太ってない!

係)さて、今日のコードだな。

な)太って…

係)たぶんお前、「なんか見慣れた感じだな」って思ったろ?
それは正解。

これはもう“COBOLの書式文化祭”の総集編みたいなもんだ。

な)太ってないからわかります!

WRITE-ERRORとヘッダー生成:COBOLの書式文化祭

係)まず WRITE-ERROR.だが

ADD 1 TO TOT-ERR
STRING IN-REC DELIMITED BY SIZE
       "," DELIMITED BY SIZE
       WS-MSG DELIMITED BY SIZE
INTO ERR-REC
END-STRING
WRITE ERR-REC.

これは「エラー行を記録」する処理。

ADD 1 TO TOT-ERR → エラー件数をカウントアップ。

STRING … INTO ERR-REC → 入力レコードとメッセージを “カンマ区切り” で連結。

WRITE ERR-REC → それをエラーファイルに書き出す。

つまり、“どんな行がエラーだったか”のログをCSVっぽく残してるんだ。

な)「太ってないから」どんどん理解できますよ!

係)こっちは帳票(レポート)のヘッダー部分。

WRITE-REPORT-HEADER.

レポート作るなら定番の「日付+タイトル+区切り線+見出し」だな。

STRING
   "=== DAILY SALES REPORT ===  "
   ...
   "Generated: " CD-YYYY "::" CD-MM "::" CD-DD
   ...
INTO OUT-REC
END-STRING
WRITE OUT-REC.

Generatedはアリ?英語・カタカナ論争の始まり

な)Generated: とかいきなり小文字使いだしてきて、おしゃれ気取ってるんですかこれ。

今どきちょいワルですか?ちょっとだけ見た目悪いとかですか?
俺、太ってないからちょい良ですよ!

係)あのな、GENERATEDよりGeneratedのほうが読みやすいだろ?そういうことだ。

な)だったら、Daisuki! とか日本語読みのほうがいいんじゃないですか?

Generatedとか英語使ってる俺最高!見た?俺の英語見た!?

って、太ってるやつのうざい感じしかしないです。

係)「Lunch Time」でも「昼飯」でも意味は同じだろ。

でも、「昼飯」って出た瞬間にテンション下がるやついるだろ。

報告書だって同じだ。

全部カタカナで“セールスレポート発生日時”って出るよりマシなんだよ。

カタカナは使える?昭和COBOLと令和COBOLの境界線

な)あれ?カタカタって普通に使えるんですか?

係)結論から言うとだな、COBOLそのものは“カタカナ使えない”わけじゃない。

でも、どんな環境で動かすかによって使える/使えないが変わる。

昭和マシン(汎用機COBOL)

昔のホスト機(IBMのz/OSとか)だと、文字コードが EBCDIC(えぶしでぃっく) ってやつで、今のパソコンのUTF-8とは違うんだ。

EBCDICではカタカナが「半角カタカナ」しかなかった時代があって、全角カタカナを使うと 化ける or 落ちる ってのが日常茶飯事。

だから昭和COBOLでは

MOVE "カタカナ" TO ITEM-NAME.

みたいな、半角カナならOKってケースが多かったというわけだ。

令和マシン編(GnuCOBOLとか)

今のGnuCOBOLみたいなオープン系COBOLは、ソースコードをUTF-8で扱える。

つまり

MOVE "カタカナ" TO WS-NAME.
MOVE "ひらがな" TO WS-NAME.
MOVE "漢字"     TO WS-NAME.

…ぜんぶ動く。

ただし、出力先の端末やファイルの文字コードがUTF-8対応してることが条件となる。

注意点としては、

COBOLは固定長文化だから、「カタカナ1文字=2バイト」扱いが多い。

出力ファイルが「1文字=1バイト」で計算されてると、桁ズレ地獄になる。

だから本番環境では「ASCIIオンリーで出せ」って今でも言われるぞ。

おむすび

な)じゃあ、“出せるけど、出すと怒られる” いつものやつですね!

係)そうだ。

カタカナは使えるけど、使うとおっさんたちの心拍数が上がる。

な)はっ!
係長も同じく心拍数上がります??

係)まぁな。

な)ふむふむ、メモメモ。

係)何書いてんだ。

な)え、いや、なんでも…

いや違いますよ!係長の心拍数を高数値マークさせ続けようなんて思ってないですよ!?

ほら、俺太ってるから心拍数高くして、何もせず痩せようと思って!

係)やっぱりデブなんじゃねーか。

な)だから、デブじゃないです!

係)自分の言ったことには責任持てよ。

係長のワンポイント

COBOL は“動くかどうか”より“化けないかどうか”を優先する言語だ。
昭和ホストでは EBCDIC の都合で全角カナは事故要因、令和COBOLはUTF-8でも出力先次第で化ける。
固定長文化では「1文字=何バイトか」がズレると帳票が即崩壊する。
だから本番では今でも“ASCIIで出せ”が鉄の掟として残るわけだ。
使えるかより、使って安全か──それが文字種選びの判断基準だ。

― 目次(読みシリーズ)へ戻る ―

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする