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

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

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

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

C

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

GCC

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

UTF-8

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

COBOL

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

Q&A

解決済

1回答

1952閲覧

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

hyogo

総合スコア23

CentOS

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

C

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

GCC

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

UTF-8

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

COBOL

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

0グッド

0クリップ

投稿2017/10/02 10:19

編集2017/10/05 08:25

OpenSourceCobol、Cなどに詳しい方ご教授いただければ幸いです。
###前提・実現したいこと 期待する結果と実際の結果とコード
出力位置を制御するDISPLAY LINE COLが日本語の場合文字化けしてしまいます。
DISPLAY LINE COL
ACCEPT LINE COL
で日本語を文字化けせず使いたいです。

コンパイル cobc -x main.cbl

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

Cobol

1// IDENTIFICATION DIVISION. 2// PROGRAM-ID. TEST01. 3// ENVIRONMENT DIVISION. 4// DATA DIVISION. 5// WORKING-STORAGE SECTION. 6 01 ABC PIC N(1). 7 01 KAKUNIN PIC X(3). 8// PROCEDURE DIVISION. 9// MAIN-START. 10 DISPLAY "あ" LINE 5 COL 5. 11 DISPLAY "い" LINE 6 COL 5 . 12 DISPLAY "う" LINE 7 COL 5 . 13 14 DISPLAY "か" LINE 5 COL 10 . 15 16 DISPLAY "く" LINE 7 COL 10 . 17 18 DISPLAY "さ" LINE 5 COL 15 . 19 DISPLAY "し" LINE 6 COL 15 . 20 DISPLAY "す" LINE 7 COL 15 . 21 22 ACCEPT ABC LINE 6 COL 10. 23 DISPLAY ABC LINE 8 COL 10. 24 ACCEPT KAKUNIN LINE 9 COL 10. 25// MAIN-END. 26// STOP RUN. 27``` 28期待する結果 29```結果 30//アンダーバーのところにACCEPTで文字を入力して 31あ  か  さ 32い  _  し 33う  く  す    34//こんな感じになるようにしてみたい 35あ  か  さ 36い  き  し 37う  く  す 38   き 39 40//出力の結果が以下のように文字化けします 41 ▒~A~B▒~A~K▒~A~U 42 ▒~A~D▒~ ~M▒~A~W 43 ▒~A~F▒~A~O▒~A~Y 44 ▒~A~M 45``` 46###対処法、ヒントになること小さなことでもご教授いただきたいです 471. COBOLの書き方でDISPLAY LINE COL以外で対処できる方法 482. OSCobolのコードを拡張してLINE COLを日本語でも文字化けしないよう修正する方法 493. 他の言語で同じような現象など 50###試したこと・調べたこと:文字化けするきっかけを探りました 51LINE COL を使うとACCEPTの入力待機時に画面が切り変わるのが文字化けのきっかけと予想しています。英数字を入力すると文字化けせず期待どおりに表示されます。 52・ACCEPTで入力時に画面が切り替わると文字化け 53・LINE COLを使わない状態だとACCEPTで入力時に画面が切り替わらない場合は文字化けしない 54```COBOL 55//変数は01 ABC PIC N(10).と宣言しました。 56//01 ABC PIC X(10).も試した結果同様でした。 57//文字化けしない 58 DISPLAY "a" 59 ACCEPT ABC. 60 DISPLAY ABC. 61``` 62```COBOL 63//文字化けしない 64 DISPLAY "あ" LINE 1 COL 1. 65``` 66```COBOL 67//文字化けしない 68 DISPLAY "あ". 69 ACCEPT ABC. 70``` 71 72```COBOL 73 DISPLAY "a" LINE 1 COL 1. //〇 aと正しく表示されます 74 ACCEPT ABC.//× 文字化け ▒~A~B こんな風になります 75 DISPLAY ABC.//〇 一瞬だけ"あ"と表示されて終了 76``` 77```COBOL 78 DISPLAY "あ" LINE 1 COL 1.//文字化け ▒~A~B こんな風になります 79 ACCEPT ABC. 80``` 81```COBOL 82 DISPLAY "a" LINE 1 COL 1. 83 ACCEPT ABC. //文字化け ▒~A~B こんな風になります 84 DISPLAY ABC.//"あ"と正しく表示されます 85 ACCEPT ABC.//文字化け ▒~A~B こんな風になりENTERで終了されます 86``` 87 88```COBOL 89//一瞬画面が切り替わり文字が見えないまま終了される 90 DISPLAY "a" LINE 1 COL 1. 91``` 92```COBOL 93//画面の切り替わりはなくaと正しく表示される 94 DISPLAY "a".  95``` 96 97###試したこと・調べたこと:Cに変換されたソース 98[OSCobol のUtf8=https://www.osscons.jp/osscobol/download/v1_5j/](https://www.osscons.jp/osscobol/download/v1_5j/) 99 100下記の3つのコードが深く関係していると考えて調べているところです。 101cobc.c→cobc.h→libcob.h→codegen.h→codegen.c→Cに変換したコードを生成 102cobc.c→cobc.h→libcob.h→termio.h→DISPLAY、ACCEPTの動きに重要そうな関数発見 103cobc.c→cobc.h→libcob.h→common.h→common.c 104・opensource-cobol-1.5.1J\libcob\codegen.c 105``` 106cobc -C main.cbl 107をするとcodegen.cでCに変換されます 108main.cbl→main.c 109COBOLのDISPLAY、ACCEPT文はcob_display,cob_acceptに変換されているようでした。 110``` 111cob_display,cob_acceptはtermio.hで定義されています。 112・opensource-cobol-1.5.1J\libcob\termio.h 113 114```C 11547 static void display_numeric (cob_field *f, FILE *fp) { 11682 static void pretty_display_numeric (cob_field *f, FILE *fp){ 117149 static void display_alnum (cob_field *f, FILE *fp){ 118159 static void display (cob_field *f, FILE *fp) { 119207 void cob_display (const int outorerr, const int newline, const int varcnt, ...){ 120``` 121 122・opensource-cobol-1.5.1J\libcob\common.h 123```C 124頻繁に出てくるcob_field,cob_field_attrは型宣言struct 125320 /* Field attribute structure */ 126typedef struct { 127 unsigned char type; /* Field type */ 128 unsigned char digits; /* Digit count */ 129 signed char scale; /* Field scale */ 130 unsigned char flags; /* Field flags */ 131 const char *pic; /* Pointer to picture string */ 132} cob_field_attr; 133 134/* Field structure */ 135typedef struct { 136 size_t size; /* Field size */ 137 unsigned char *data; /* Pointer to field data */ 138 const cob_field_attr *attr; /* Pointer to attribute */ 139} cob_field; 140``` 141 142###試したこと・調べたこと:localeをja_JP.UTF-8 143```ここに言語を入力 144$ vi /etc/sysconfig/i18n 145#LANG="en_US.UTF-8" //コメントアウト 146LANG="ja_JP.UTF-8" //追加 147 148$ locale 149LANG=ja_JP.UTF-8 150LC_CTYPE="ja_JP.UTF-8" 151LC_NUMERIC="ja_JP.UTF-8" 152LC_TIME="ja_JP.UTF-8" 153LC_COLLATE="ja_JP.UTF-8" 154LC_MONETARY="ja_JP.UTF-8" 155LC_MESSAGES="ja_JP.UTF-8" 156LC_PAPER="ja_JP.UTF-8" 157LC_NAME="ja_JP.UTF-8" 158LC_ADDRESS="ja_JP.UTF-8" 159LC_TELEPHONE="ja_JP.UTF-8" 160LC_MEASUREMENT="ja_JP.UTF-8" 161LC_IDENTIFICATION="ja_JP.UTF-8" 162LC_ALL= 163``` 164 165###何かヒントとなることでも頂けると助かります 166OSCobolを使っている方、他の言語で似たようなことになったことがある方、引き続き調べて、必要な情報など追記できればと思っていますのでコメントいただきたくよろしくお願いいたします。 167###OpensourceCobol utf8のインストール 168```ここに言語を入力 169sudo yum groupinstall "Development Tools" 170sudo yum install gmp-devel db4 db4-devel ncurses-devel 171cd /home/vagrant 172wget 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" 173./configure --enable-utf8 174make 175make install 176``` 177 178###環境 179ユーザー /home/vagrant 180Vagrant VertualBOX 181CentOS release 6.7 182```ここに言語を入力 183vagrant box add centos6-7 https://github.com/CommanderK5/packer-centos-template/releases/download/0.6.7/vagrant-centos-6.7.box 184 185```gcc 186OpenSourceCobol 1.5.1.0 utf8 187TeraTerm 188win10コマンドプロンプト chcp 65001 189 190###Cobolコンパイルと実行 191```ここに言語を入力 192cobc -x main.cbl 193./main 194``` 195 196###環境export -p 197```ここに言語を入力 198[vagrant@localhost ~]$ export -p 199declare -x G_BROKEN_FILENAMES="1" 200declare -x HISTCONTROL="ignoredups" 201declare -x HISTSIZE="1000" 202declare -x HOME="/home/vagrant" 203declare -x HOSTNAME="localhost.localdomain" 204declare -x LANG="ja_JP.UTF-8" 205declare -x LESSOPEN="||/usr/bin/lesspipe.sh %s" 206declare -x LOGNAME="vagrant" 207declare -x LS_COLORS="省略" 208declare -x MAIL="/var/spool/mail/vagrant" 209declare -x OLDPWD 210declare -x PATH="/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin" 211declare -x PWD="/home/vagrant" 212declare -x SHELL="/bin/bash" 213declare -x SHLVL="1" 214declare -x SSH_CLIENT="省略" 215declare -x SSH_CONNECTION="省略" 216declare -x SSH_TTY="/dev/pts/0" 217declare -x TERM="cygwin" 218declare -x USER="vagrant" 219``` 220 221###cobolソースの文字コードとCに変換したソースの文字コード 222nkfをインストールして使いました。 223 224win10コマンドプロンプトで実行 225```ここに言語を入力 226yum install nkf 227[vagrant@localhost ~]$ cobc -x main.cbl 228[vagrant@localhost ~]$ nkf -g main.cbl 229UTF-8 (LF) 230[vagrant@localhost ~]$ cobc -C main.cbl 231[vagrant@localhost ~]$ nkf -g main.c 232[vagrant@localhost ~]$ ls 233main main.c main.c.h main.c.l.h main.cbl 234``` 235Teratermで実行 236```ここに言語を入力 237[vagrant@localhost ~]$ cobc -x main.cbl 238[vagrant@localhost ~]$ nkf -g main.cbl 239UTF-8 (LF) 240[vagrant@localhost ~]$ cobc -C main.cbl 241[vagrant@localhost ~]$ nkf -g main.c 242UTF-8 (LF) 243[vagrant@localhost ~]$ ls 244main main.c.h main.cbl 245main.c main.c.l.h 246``` 247 248```Cobol 249 IDENTIFICATION DIVISION. 250 PROGRAM-ID. TEST01. 251 ENVIRONMENT DIVISION. 252 DATA DIVISION. 253 WORKING-STORAGE SECTION. 254 01 ABC PIC N(5). 255 01 KAKUNIN PIC X(3). 256 PROCEDURE DIVISION. 257 MAIN-START. 258 259 DISPLAY "あ" LINE 2 COL 1. 260 ACCEPT ABC. 261 262 MAIN-END. 263 STOP RUN. 264``` 265結果はこうなりました 266Teratermで実行 267```ここに言語を入力 268筐A~D →い、と入力 269筐A~B →DISPALY "あ"表示 270``` 271win10コマンドプロンプトで実行 272```ここに言語を入力 273▒~A~D →い、と入力 274▒~A~B →DISPALY "あ"表示 275``` 276###Cソースをgcc -gを試してみました。 277あとの検証に役立つかもと思い追記します。 278Cでincludeがうまくいってないと思っています 279```ここに言語を入力 280[vagrant@localhost ~]$ gcc -g main.c 281/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o: In function `_start': 282(.text+0x20): undefined reference to `main' 283/tmp/ccr0Fl4n.o: In function `TEST01_': 284/home/vagrant/main.c:61: undefined reference to `cob_current_module' 285/home/vagrant/main.c:62: undefined reference to `cob_current_module' 286/home/vagrant/main.c:63: undefined reference to `cob_push_call_stack_list' 287/home/vagrant/main.c:68: undefined reference to `cob_initialized' 288/home/vagrant/main.c:69: undefined reference to `cob_fatal_error' 289/home/vagrant/main.c:71: undefined reference to `cob_check_version' 290/home/vagrant/main.c:73: undefined reference to `cob_set_cancel' 291~cob_displayなどが未定義ということで途中記載省略~ 292/home/vagrant/main.c:198: undefined reference to `cob_stop_run' 293collect2: ld はステータス 1 で終了しました 294```

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hotta

2017/10/04 04:35

CentOS にログインするのに使っている端末ソフトの名前や、環境変数 LANG の値なども【質問欄に】追記願います。あと、フォルダ区切りが "\" になっていますが、Cobol は Linux 側でビルド&実行しているんですよね?
hyogo

2017/10/04 12:16

修正のご依頼ありがとうございます。CobolはLinux側のVagrantユーザーディレクトリでビルド&実行しています。OScobolの中身を調べるためにWin10に置いたデータのパスを載せました。環境変数LANG、Locale、端末を追記しました。
hotta

2017/10/04 23:24

Locale と declare ... を表示したコマンド行も(プロンプトと)合わせて記載してください。なお、コンパイル後のバイナリの実行も Linux 側で行っているんですよね?
hotta

2017/10/05 02:05

LANG="en_GB.UTF-8" ってどこから来たんでしょうね。バイナリを実行しているユーザーのホームディレクトリ上で、grep -r en_GB.UTF-8 . した結果を貼ってください。
hyogo

2017/10/05 03:06

"en_GB.UTF-8"で調べていますが試しに"ja_JP.UTF-8"で試したことをお伝えしたく追記しました。説明不足で失礼いたしました。結果は同じでしたので"en_GB.UTF-8"でその後も実行しています。
hotta

2017/10/05 03:06

LANG=ja_JP.UTF-8 と LANG=en_GB.UTF-8 のどちらが現在の設定なんですか?
hyogo

2017/10/05 03:08

$ cd→$ pwd→$ /home/vagrant でgrep -r en_GB.UTF-8を実行した結果何も出てきませんでした。rootで実行するとかなり長い結果が出てきたのですが貼った方がよろしいでしょうか?
hotta

2017/10/05 03:08

en_GB.UTF-8 にせよという情報はどこから持ってきたんでしょうか?
hyogo

2017/10/05 03:11

早速のご返信ありがとうございます。vi /etc/sysconfig/i18nで"en_GB.UTF-8" にしています。
hotta

2017/10/05 03:13

いや設定箇所じゃなくて、そうしなさいという指示の情報です。マニュアルかなにかに書いてあるなら、その URL を教えてください。
hyogo

2017/10/05 03:15

特にどこかの情報を参考にしたわけではないのですが、CentOSのデフォルトのまま実行しました。
hotta

2017/10/05 03:18

CentOSのデフォルト?日本語を扱うプログラムを開発するのに、英国英語(en_GB.UTF-8)でインストールしたんですか?
hyogo

2017/10/05 03:23

CentOSのインストールはこちらの記事を参考させていただきました。
hotta

2017/10/05 03:26

わかりました。en_GB.UTF-8 はおそらく忘れてもらっていいので、すべて ja_JP.UTF-8 に統一してください。その後、bash のコマンドライン上で echo 日本語 とやって、日本語が正しく表示されることを確認してください。
hyogo

2017/10/05 03:58

ありがとうございました。ja_JP.UTF-8にしてecho 日本語正しく”日本語”と表示されました。en_GB.UTF-8でも同様に”日本語”と表示されました。質問文をja_JP.UTF-8での結果に変更いたします。
hotta

2017/10/05 04:11

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

2017/10/05 07:42

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

2017/10/05 08:32

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

回答1

0

ベストアンサー

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

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

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

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

投稿2017/10/11 08:40

編集2017/10/11 08:43
Harahira

総合スコア243

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hyogo

2017/10/13 02:16

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問