質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • C

    3685questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • CentOS

    2704questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • GCC

    141questions

    GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

  • UTF-8

    109questions

    UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

  • COBOL

    21questions

    COBOL(COmmon Business Oriented Langage)は、実務処理用に開発されたプログラミング言語です。

OSCobol:画面の切り替わりをきっかけに日本語を使うと"▒~A~B"文字化けします

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 431

hyogo

score 6

OpenSourceCobol、Cなどに詳しい方ご教授いただければ幸いです。

前提・実現したいこと 期待する結果と実際の結果とコード

出力位置を制御するDISPLAY LINE COLが日本語の場合文字化けしてしまいます。
DISPLAY LINE COL
ACCEPT LINE COL
で日本語を文字化けせず使いたいです。

コンパイル
cobc -x main.cbl


下のような簡単なコードが文字化けしてしまいます。

//       IDENTIFICATION DIVISION.
//       PROGRAM-ID.             TEST01.
//       ENVIRONMENT DIVISION.
//       DATA DIVISION.
//       WORKING-STORAGE SECTION.
            01  ABC   PIC N(1).
            01  KAKUNIN   PIC X(3).
//       PROCEDURE DIVISION.
//       MAIN-START.
           DISPLAY "あ" LINE 5 COL 5.
           DISPLAY "い" LINE 6 COL 5 .
           DISPLAY "う" LINE 7 COL 5 .

           DISPLAY "か" LINE 5 COL 10 .

           DISPLAY "く" LINE 7 COL 10 .

           DISPLAY "さ" LINE 5 COL 15 .
           DISPLAY "し" LINE 6 COL 15 .
           DISPLAY "す" LINE 7 COL 15 .

           ACCEPT ABC  LINE 6 COL 10.
           DISPLAY ABC LINE 8 COL 10.
           ACCEPT KAKUNIN LINE 9 COL 10.
//       MAIN-END.
//           STOP RUN.


期待する結果

//アンダーバーのところにACCEPTで文字を入力して
あ  か  さ
い  _  し
う  く  す   
//こんな感じになるようにしてみたい
あ  か  さ
い  き  し
う  く  す
   き

//出力の結果が以下のように文字化けします
    ▒~A~B▒~A~K▒~A~U
    ▒~A~D▒~ ~M▒~A~W
    ▒~A~F▒~A~O▒~A~Y
         ▒~A~M

対処法、ヒントになること小さなことでもご教授いただきたいです

  1. COBOLの書き方でDISPLAY LINE COL以外で対処できる方法
  2. OSCobolのコードを拡張してLINE COLを日本語でも文字化けしないよう修正する方法
  3. 他の言語で同じような現象など

試したこと・調べたこと:文字化けするきっかけを探りました

LINE COL を使うとACCEPTの入力待機時に画面が切り変わるのが文字化けのきっかけと予想しています。英数字を入力すると文字化けせず期待どおりに表示されます。
・ACCEPTで入力時に画面が切り替わると文字化け
・LINE COLを使わない状態だとACCEPTで入力時に画面が切り替わらない場合は文字化けしない

//変数は01 ABC PIC N(10).と宣言しました。
//01 ABC PIC X(10).も試した結果同様でした。
//文字化けしない
           DISPLAY "a" 
           ACCEPT ABC.
           DISPLAY ABC.
//文字化けしない
           DISPLAY "あ" LINE 1 COL 1. 
//文字化けしない
           DISPLAY "あ". 
           ACCEPT ABC.
           DISPLAY "a" LINE 1 COL 1. //〇 aと正しく表示されます
           ACCEPT ABC.//× 文字化け ▒~A~B こんな風になります
           DISPLAY ABC.//〇 一瞬だけ"あ"と表示されて終了
           DISPLAY "あ" LINE 1 COL 1.//文字化け ▒~A~B こんな風になります 
           ACCEPT ABC.
           DISPLAY "a" LINE 1 COL 1.
           ACCEPT ABC. //文字化け ▒~A~B こんな風になります
           DISPLAY ABC.//"あ"と正しく表示されます
           ACCEPT ABC.//文字化け ▒~A~B こんな風になりENTERで終了されます
//一瞬画面が切り替わり文字が見えないまま終了される
           DISPLAY "a" LINE 1 COL 1.
//画面の切り替わりはなくaと正しく表示される
           DISPLAY "a". 

試したこと・調べたこと:Cに変換されたソース

OSCobol のUtf8=https://www.osscons.jp/osscobol/download/v1_5j/

下記の3つのコードが深く関係していると考えて調べているところです。
cobc.c→cobc.h→libcob.h→codegen.h→codegen.c→Cに変換したコードを生成
cobc.c→cobc.h→libcob.h→termio.h→DISPLAY、ACCEPTの動きに重要そうな関数発見
cobc.c→cobc.h→libcob.h→common.h→common.c
・opensource-cobol-1.5.1J\libcob\codegen.c

cobc -C main.cbl 
をするとcodegen.cCに変換されます
main.cblmain.c
COBOLDISPLAYACCEPT文はcob_display,cob_acceptに変換されているようでした。


cob_display,cob_acceptはtermio.hで定義されています。
・opensource-cobol-1.5.1J\libcob\termio.h

47 static void display_numeric (cob_field *f, FILE *fp) {
82 static void pretty_display_numeric (cob_field *f, FILE *fp){
149 static void display_alnum (cob_field *f, FILE *fp){
159 static void display (cob_field *f, FILE *fp) {
207 void cob_display (const int outorerr, const int newline, const int varcnt, ...){

・opensource-cobol-1.5.1J\libcob\common.h

頻繁に出てくるcob_field,cob_field_attrは型宣言struct
320 /* Field attribute structure */
typedef struct {
    unsigned char    type;        /* Field type */
    unsigned char    digits;        /* Digit count */
    signed char    scale;        /* Field scale */
    unsigned char    flags;        /* Field flags */
    const char    *pic;        /* Pointer to picture string */
} cob_field_attr;

/* Field structure */
typedef struct {
    size_t            size;        /* Field size */
    unsigned char        *data;        /* Pointer to field data */
    const cob_field_attr    *attr;        /* Pointer to attribute */
} cob_field;

試したこと・調べたこと:localeをja_JP.UTF-8

$ vi /etc/sysconfig/i18n
#LANG="en_US.UTF-8" //コメントアウト
LANG="ja_JP.UTF-8" //追加

$ locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=

何かヒントとなることでも頂けると助かります

OSCobolを使っている方、他の言語で似たようなことになったことがある方、引き続き調べて、必要な情報など追記できればと思っていますのでコメントいただきたくよろしくお願いいたします。

OpensourceCobol utf8のインストール

sudo yum groupinstall "Development Tools"
sudo yum install gmp-devel db4 db4-devel ncurses-devel
cd /home/vagrant
wget opensource-cobol-1.5.1J "https://www.osscons.jp/osscobol/files/?action=cabinet_action_main_download&block_id=414&room_id=21&cabinet_id=11&file_id=382&upload_id=761"
./configure --enable-utf8
make
make install

環境

ユーザー /home/vagrant
Vagrant VertualBOX
CentOS release 6.7

vagrant box add centos6-7 https://github.com/CommanderK5/packer-centos-template/releases/download/0.6.7/vagrant-centos-6.7.box

gcc
OpenSourceCobol 1.5.1.0 utf8
TeraTerm
win10コマンドプロンプト chcp 65001

Cobolコンパイルと実行

cobc -x main.cbl
./main

環境export -p

[vagrant@localhost ~]$ export -p
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
declare -x HOME="/home/vagrant"
declare -x HOSTNAME="localhost.localdomain"
declare -x LANG="ja_JP.UTF-8"
declare -x LESSOPEN="||/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="vagrant"
declare -x LS_COLORS="省略"
declare -x MAIL="/var/spool/mail/vagrant"
declare -x OLDPWD
declare -x PATH="/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin"
declare -x PWD="/home/vagrant"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_CLIENT="省略"
declare -x SSH_CONNECTION="省略"
declare -x SSH_TTY="/dev/pts/0"
declare -x TERM="cygwin"
declare -x USER="vagrant"

cobolソースの文字コードとCに変換したソースの文字コード

nkfをインストールして使いました。

win10コマンドプロンプトで実行

yum install nkf
[vagrant@localhost ~]$ cobc -x main.cbl
[vagrant@localhost ~]$ nkf -g main.cbl
UTF-8 (LF)
[vagrant@localhost ~]$ cobc -C main.cbl
[vagrant@localhost ~]$ nkf -g main.c
[vagrant@localhost ~]$ ls
main  main.c  main.c.h  main.c.l.h  main.cbl


Teratermで実行

[vagrant@localhost ~]$ cobc -x main.cbl
[vagrant@localhost ~]$ nkf -g main.cbl
UTF-8 (LF)
[vagrant@localhost ~]$ cobc -C main.cbl
[vagrant@localhost ~]$ nkf -g main.c
UTF-8 (LF)
[vagrant@localhost ~]$ ls
main    main.c.h    main.cbl
main.c  main.c.l.h
       IDENTIFICATION DIVISION.
       PROGRAM-ID.             TEST01.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
            01  ABC   PIC N(5).
            01  KAKUNIN   PIC X(3).
       PROCEDURE DIVISION.
       MAIN-START.

           DISPLAY "あ" LINE 2 COL 1.
           ACCEPT ABC.

       MAIN-END.
           STOP RUN.


結果はこうなりました
Teratermで実行

筐A~D →い、と入力
筐A~B DISPALY "あ"表示


win10コマンドプロンプトで実行

▒~A~D →い、と入力
▒~A~B DISPALY "あ"表示

Cソースをgcc -gを試してみました。

あとの検証に役立つかもと思い追記します。
Cでincludeがうまくいってないと思っています

[vagrant@localhost ~]$ gcc -g main.c
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
/tmp/ccr0Fl4n.o: In function `TEST01_':
/home/vagrant/main.c:61: undefined reference to `cob_current_module'
/home/vagrant/main.c:62: undefined reference to `cob_current_module'
/home/vagrant/main.c:63: undefined reference to `cob_push_call_stack_list'
/home/vagrant/main.c:68: undefined reference to `cob_initialized'
/home/vagrant/main.c:69: undefined reference to `cob_fatal_error'
/home/vagrant/main.c:71: undefined reference to `cob_check_version'
/home/vagrant/main.c:73: undefined reference to `cob_set_cancel'
~cob_displayなどが未定義ということで途中記載省略~
/home/vagrant/main.c:198: undefined reference to `cob_stop_run'
collect2: ld はステータス 1 で終了しました
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hotta

    2017/10/05 13:11

    次は、COBOL ソース(ただし日本語リテラルを含むもの)とそれから生成された C のソースのエンコーディングが、いずれも UTF-8 になっていることを確認してください。

    キャンセル

  • hotta

    2017/10/05 16:42

    再現性はありそうですね。念のため TeraTerm で実行した際の、プロンプトと起動コマンドも合わせて記載してください。Win10 のコマンドプロンプトは問題を複雑にするので、とりあえず後回しです。あとは、こちらで同じ環境を作って再現してみたいですが、私も COBOL は初めてなので、ちょっと時間がかかりそうです。

    キャンセル

  • hyogo

    2017/10/05 17:32

    至らぬ質問にお付き合いいただき感謝します。LinuxもCもCobolも未熟ですが問題にぶつかるほど知識がつくので乗り越えたいと思っています。

    キャンセル

回答 1

checkベストアンサー

+1

ちょっとopensource-cobolのソースを見てましたが、DISPLAY LINE COLでの表示は、ncursesライブラリを用いて行われているようです。

opensource-cobolのmake時には、普通のncursesがリンクされているようで、この状態では日本語の表示は不可能です。

無理やりMakefileをいじって、ワイド文字対応のncurseswをリンクしてみたら、日本語の表示ができるようになりました。

opensource-cobolの開発元に、ncursesの代わりにncurseswをリンクするように直してくれとお願いするしかないと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/13 11:16

    Harahira様
    DISPLAY LINE COLは./configureで-lncurseswにリンクするようにしたらおっしゃるとおり日本語表示できました。
    ACCEPT LINE COLはscreeniio.cのcob_field_acceptが問題のようで、まだ文字化けしてしまいます。hotta様に環境変数などOS設定の確認事項を教えていただいたので、これはそもそもマルチバイトに対応していないのではと思い書き換えにトライしています。
    長引きそうなのでこの質問は閉じたいと思います。
    ありがとうございました。またよろしくお願いいたします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3685questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • CentOS

    2704questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • GCC

    141questions

    GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

  • UTF-8

    109questions

    UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

  • COBOL

    21questions

    COBOL(COmmon Business Oriented Langage)は、実務処理用に開発されたプログラミング言語です。