COBOL製品技術情報(FAQ)


Linux 上で全角文字が文字化けしたり空白になる

【事象例】
Red Hat Enterprise Linux 環境にてバッチ実行を行うロケール設定を以下のように設定しています。

LANG=ja_JP.sjis

全角文字を含むプログラムをコンパイルすると、全角文字がコンパイルリスト上で空白や文字化けする事象が発生します。
プログラムからその文字を書き出したファイル上でも、コンパイルリストと同様に空白や文字化けが発生します。

【理由と対処方法】 

  • 全角文字が全て文字化けする場合
    LANG 環境変数以外にコンパイル時の日本語処理に関連する設定として NCHAR 指令があります。
    当該指令の詳細は製品マニュアルのトップから [リファレンス] > [コンパイラ指令] > [言語機能] > [言語機能 - 方言] > [NCHAR] と進んでご参照いただきますが、まず当該指令を追加して再コンパイルすることで文字化けが解消するかどうかをご確認ください。
    また、日本語環境において当該指令は通常 $COBDIR/etc/cobol.dir に記述され、コンパイル時に暗黙的に読み込まれますが、製品のインストール時に日本語ロケールが有効になっていないと、当該ファイルに日本語環境用の設定が行われません。
    以下は日本語環境での当該ファイルの記述内容です。
    念のため、こちらが設定されているかどうかも併せてご確認ください。
    $ cat $COBDIR/etc/cobol.dir
    CURRENCY-SIGN"92"
    NCHAR"2"
  • 環境依存文字のみが文字化けする場合
    Visual COBOL のコンパイラ及びランタイムは様々な場面でマルチバイト文字に対して OS の機能で値チェック・変換を行っています。
    この処理において環境依存文字のみが文字化けする場合、ご使用環境のロケール設定で対象の文字がマルチバイト文字として認識されていないことが原因として推測されます。
    このことを検証するために、ご使用環境上で以下の例のように iconv コマンドを使用して対象の文字が正しく扱える設定になっているかご確認ください。
    x"8782" (№) の確認例:~
    $ cat T28095.txt~
    №~
    $ iconv T28095.txt~
    iconv: 位置 0 に不正な入力シーケンスがあります
    上記のように表示される場合には、ロケールがこの文字をマルチバイト文字として認識していませんので使用することはできません。
    このような場合、root ユーザーで以下のように ja_JP.sjis ロケールで使用するキャラクタマップを通常の SHIFT_JIS ではなく WINDOWS-31J または CP932 に変更することにより、この文字化けは解消するものと考えます。
    # localedef -f WINDOWS-31J -i ja_JP ja_JP.sjis
    この対応策はあくまで一例であり、また上記のロケール設定の変更はシステム全体に影響しますので、実際にどのような手法で対応されるかはシステム管理者とご相談ください。