26.5.1 基本機能

ここでは,転記,文字列操作文などの基本機能での規則について説明します。

<この項の構成>
(1) 文字の長さ
(2) 空白文字,表意定数SPACE,および転記の空白詰めの文字コード
(3) 表意定数ZEROの文字コード
(4) 文字コードを変換するプログラム例
(5) 用途DISPLAYと用途NATIONALとの間の変換
(6) 入出力データの変換
(7) シフトJIS範囲外の文字
(8) データの比較

(1) 文字の長さ

UTF-8はシフトJISと比較して文字の長さ(バイト数)が異なります。そのため,表示または印刷上の長さ(文字数)と実際にデータとして格納するときの長さ(バイト数)が異なります。用途がDISPLAYの項目は1バイトを1文字として扱っているため,これらの相違を考慮して確保してください。各文字コードの文字の長さを次に示します。

表26-8 各文字コードの文字の長さ(バイト数)

文字コード半角英数字半角かたかな全角(日本語)
シフトJIS112
UTF-8133

半角かたかなの文字コードの例を次に示します。

(例)
UTF-8の場合,半角かたかなは3バイトで表現するため,TEST-DATA1は英数字で9けた必要となります。
[図データ]

全角文字の文字コードの例を次に示します。

(例)
UTF-16の場合,全角文字は2バイトで表現するため,TEST-DATA2は2けた必要となります。UTF-8の場合,全角文字は3バイトで表現するため,TEST-DATA3は6けた必要となります。
[図データ]

(2) 空白文字,表意定数SPACE,および転記の空白詰めの文字コード

空白文字,表意定数SPACE,および転記の空白詰めの文字コードについて,次に示します。

(3) 表意定数ZEROの文字コード

表意定数ZEROの文字コードについて,次に示します。

(4) 文字コードを変換するプログラム例

Unicode機能を使用するプログラム実行時には,用途がDISPLAY/NATIONALの項目に格納される文字データはすべてUTF-8/UTF-16として処理します。たとえば,ファイルから読み込んだレコード項目にシフトJISの文字データが格納されることで,用途がDISPLAY/NATIONALの項目にUTF-8/UTF-16以外の文字データが格納される場合は,コード変換ライブラリを使用して入力データをUTF-8/UTF-16へ変換する必要があります。

コード変換ライブラリを使用してシフトJISの文字データをUTF-8へ変換するコーディング例を次に示します。

コンパイル例
HP-UX(IPF)の場合

ccbl2002 -UniObjGen sample1.cbl  -L /opt/hcodecnv32/lib -lhcodecnv

AIX(32)の場合

ccbl2002 -UniObjGen sample1.cbl  -L /opt/hcodecnv/lib -lhcodecnv -brtl

AIX(64)の場合

ccbl2002 -UniObjGen sample1.cbl  -L /opt/hcodecnv64/lib -lhcodecnv64 -brtl

Linux(x86)の場合

ccbl2002 -UniObjGen sample1.cbl  -L /opt/hcodecnv/lib -lhcodecnv

Linux(x64)の場合

ccbl2002 -UniObjGen sample1.cbl  -L /opt/hcodecnv64/lib -lhcodecnv64

プログラム例

      IDENTIFICATION DIVISION.
      PROGRAM-ID. SAMPLE1.
      DATA DIVISION.
      WORKING-STORAGE SECTION.
     *>コード変換ライブラリ提供の登録集原文の取り込み
      COPY 'codeconv.cbl'.
      01 CONV-TABLE-P   ADDRESS.
      01 DEFAULT-CODE1  PIC X(1).
      01 DEFAULT-CODE2  PIC X(1).
      01 TABLE-FULLPATH ADDRESS VALUE NULL.
      01 MAPPING-FULLPATH ADDRESS VALUE NULL.
      01 RETCODE        PIC 9(9) USAGE COMP.
      01 SYSTEM-ERRCODE PIC 9(9) USAGE COMP.
      01 INLEN          PIC 9(9) USAGE COMP.
      01 INBUF          PIC X(100).
      01 OUTLEN         PIC 9(9) USAGE COMP.
      01 OUTBUF         PIC X(300).
      PROCEDURE DIVISION.
          CALL 'CodeConvOpen' USING
              BY VALUE     CCF-SJIS-UTF
                           0
              BY REFERENCE DEFAULT-CODE1
                           DEFAULT-CODE2
              BY VALUE     TABLE-FULLPATH
                           MAPPING-FULLPATH
              BY REFERENCE RETCODE
                           SYSTEM-ERRCODE
              RETURNING CONV-TABLE-P.
          IF CONV-TABLE-P NOT = NULL THEN
              COMPUTE CCT-CODECONVTABLEA = CONV-TABLE-P
                        :
              (INBUFにシフトJISデータを格納)
                        :
              MOVE 100 TO INLEN
              MOVE 300 TO OUTLEN
              CALL 'CodeConvString' USING
                  BY REFERENCE CCT-CODECONVTABLE
                               INLEN
                               INBUF
                               OUTLEN
                               OUTBUF
          ELSE      *>エラー時の処理
                   :
          END-IF.
          CALL 'CodeConvClose' USING
              BY REFERENCE CCT-CODECONVTABLE
                           SYSTEM-ERRCODE.
          DISPLAY 'INBUF=' INBUF.
          DISPLAY 'OUTBUF=' OUTBUF.
          EXIT PROGRAM.

(5) 用途DISPLAYと用途NATIONALとの間の変換

用途がDISPLAYの項目と,用途がNATIONALの項目との間で変換(転記)する場合,コード変換ライブラリを使用してUTF-8とUTF-16を相互に変換する必要があります。

(6) 入出力データの変換

CSV編成ファイルを除き,入出力データは無変換とします。入出力データとは,次の機能使用時に入出力されるデータのことです。

(7) シフトJIS範囲外の文字

シフトJIS範囲外の文字については,16進英数字定数または16進日本語文字定数を使用し,UTF-8またはUTF-16のコード値を直接指定してください。このとき,16進日本語文字定数は,常にUTF-16BEで指定してください。COBOL2002コンパイラは,-UniEndianオプションの指定に従い,16進日本語文字定数の文字コードを変換します。

(8) データの比較

データの比較は,文字コードによるバイナリ比較となります。そのため,用途がNATIONALの項目または日本語文字定数の大小比較はバイトオーダによって結果が異なります。