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```
回答1件
あなたの回答
tips
プレビュー