VOOZH about

URL: https://qiita.com/Keita_INAGAKI/items/6bb0551a483379a94229

⇱ COBOLで湯婆婆を実装してみる~2バイト文字判定の仕方~ #cobol - Qiita


👁 Image
10

Go to list of users who liked

4

Share on X(Twitter)

Share on Facebook

Add to Hatena Bookmark

More than 5 years have passed since last update.

@Keita_INAGAKI(Keita INAGAKI)in👁 Image
株式会社Works Human Intelligence

COBOLで湯婆婆を実装してみる~2バイト文字判定の仕方~

10
Last updated at Posted at 2020-11-16

はじめに

@Nemesisさんの「Javaで湯婆婆を実装してみる」が話題なので、流行りに乗っかろうと思います。
まだ書かれていなそうな言語、ということで昔使っていたCOBOLでやってみることにしました。

必要な処理と対応するCOBOL構文

湯婆婆の処理の流れは、以下の4工程です。
①コンソールに規定のメッセージを出力
②コンソールに入力された名前を受け取る
③ランダムで何文字目かを決める
④決めた文字を規定のメッセージに含めて出力

各処理に対応するCOBOL構文は以下の通りです。

  • コンソール出力
    DISPLAY 変数.
  • コンソール入力
    ACCEPT 変数 FROM CONSOLE.
  • ランダム
    FUNCTION RANDOM().
  • 値の代入
    MOVE 1 TO 変数.
  • 部分文字列の取得
    文字型変数(開始Index:取得バイト数)
  • 変数宣言
    01 変数 PIC X(40).
  • コメントアウト
    7バイト目に*を付けた行

コード(その1)

苦戦はしましたが、一通りの処理が書けました。早速実行してみます。 ![hankaku.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858001/f92b990e-ed7f-c7b6-d8f4-2d68e2cc964c.png) 良い感じに文字を奪って出力できています。が、 ![2baito.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858001/3633b171-02c0-8091-85f6-82527a50405e.png) **\ 2バイト文字だー!! /** COBOLの部分参照はバイト単位なので、**2バイト文字の考慮が必要**でした。 ググれば何とかなる、と思ったら同じような書き込み多数で、どうやら便利な関数は無いようです。 覚悟を決めて[sjisの文字コード表](https://ja.wikipedia.org/wiki/Shift_JIS)を確認します。 1バイト目を確認すれば、それが1バイトの文字か2バイトの文字かが判断できるようなので、 COBOLの制御に組み込んでみます。半角カナの範囲も忘れずに判定します。
 * 全角半角判定
 IF (IN-NAME(TMP-IDX:1) >= X"00" AND
 IN-NAME(TMP-IDX:1) <= X"7F") OR -- ascii
 (IN-NAME(TMP-IDX:1) >= X"A1" AND
 IN-NAME(TMP-IDX:1) <= X"DF") THEN -- 半角カナ
 * DISPLAY "半角:" IN-NAME(TMP-IDX:1)
 ELSE
 * DISPLAY "全角:" IN-NAME(TMP-IDX:2)
 ADD 1 TO TMP-IDX -- 次の文字までIndexをずらす
 END-IF

1バイト目の文字範囲をチェックし、2バイト文字であれば2バイトの塊として扱う形で記述しています。
(定義外のエリアをどう扱うべきか、ちょっとわからなかったので、とりあえず2バイト扱いしています。。)

コード(最終版)

実行結果はこちら! ![perfect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858001/61f6abf9-f087-a6a3-29c9-78549b346f56.png) 無事に全角/半角/半角カナで文字を奪うことに成功しました! もちろん、入力文字が空の際はちゃんとエラーになります。 ![error2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858001/15074284-836b-50eb-21fd-e176fabae6ac.png) これをもって、COBOL版湯婆婆とさせていただきます。

おわりに

高級言語のありがたみを実感しました。
ただ今回のおかげで、今まで敬遠していた文字コードと向かい合うことができ、理解が進んだので、
湯婆婆に取り組んで良かったな、と思います。ありがとうございました。

10

Go to list of users who liked

4
0

Go to list of comments

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10

Go to list of users who liked

4