COBOL2002 ユーザーズガイド

[目次][用語][索引][前へ][次へ]

30.5.1 基本機能

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

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

(1) UnicodeとCOBOLの文字数の関係

(a) UnicodeとCOBOLの文字数

シフトJISでは,1文字のバイト数は半角1バイト,全角2バイトと決まっていますが,Unicodeでは,1文字のバイト数は文字によって異なります。

例えば,UTF-8では半角英数字は1文字1バイトですが,半角かたかなは1文字3バイト,全角日本語は3〜8バイトの可変長になります。また,UTF-16でも,全角日本語は2バイト,4バイト(サロゲートペア文字),6〜8バイト(IVS文字)の可変長となります。

一方,COBOLの文字項目は,1文字のバイト数は文字に関係なく固定となります。

例えば,英数字項目(PIC X)では,1文字は1バイト固定,日本語項目(PIC N)では,1文字は2バイト固定となります。このため,COBOLの文字項目にUnicodeデータを格納する場合,見た目の1文字とCOBOLが扱う1文字は異なります。

見た目の1文字(Character)と区別するため,PICTURE句に指定する長さをけた(COBOL2002規格では「文字位置」(Character Position))と呼びます。

サロゲートペアやIVSを含めて,字類が英字,英数字,および日本語の項目に格納した各種文字のバイト数,けた数,文字数,および見た目幅の値を次の表に示します。なお,文字の長さの具体例については,「(2) 文字の長さ」を参照してください。

表30-11 字類が英字,英数字の項目の場合(UTF-8エンコーディング)

説明 バイト数 けた数※1 文字数 見た目幅
半角※2 ASCII文字 1 1 1 1
半角かたかな 3 3 1 1
その他の半角文字※3 3 3 1 1
全角(日本語) Unicodeの基本多言語面の文字 2〜3 2〜3 1 2
Unicodeの追加漢字面の文字(UTF-16のサロゲートペアで表される文字) 4 4 1 2
IVSで表される文字 7〜8 7〜8 1 2

表30-12 字類が日本語の項目の場合(UTF-16エンコーディング)

説明 バイト数 けた数※1 文字数 見た目幅
半角※2 ASCII文字 2 1 1 1
半角かたかな 2 1 1 1
その他の半角文字※3 2 1 1 1
全角(日本語) Unicodeの基本多言語面の文字 2 1 1 2
Unicodeの追加漢字面の文字(UTF-16のサロゲートペアで表される文字) 4 2 1 2
IVSで表される文字 6または8 3または4 1 2

注※1
PICTURE句の文字列に指定した値です。

注※2
次の範囲をUnicodeの半角文字とみなします。
U+0000〜U+007F,U+FF61〜U+FFDC,U+FFE8〜U+FFEE

注※3
その他の半角文字には,半角の矢印([図データ][図データ])などがあります。コード範囲はU+FFE8〜U+FFEEです。

(b) 結合文字

結合文字(例:「か」+「゛」⇒「が」)が格納されている場合は,2文字として扱います。

(c) サロゲートペア文字

Unicode機能でのサロゲートペア文字は,次の点を考慮してプログラミングすることで,ユーザデータとして使用できます。なお,IVSの異体字セレクタはサロゲートペア文字で表すため,IVSも同様に注意が必要です。

COBOLプログラムでサロゲートペア文字を含むデータ使用時の注意事項
  • データ定義での注意事項
    サロゲートペア文字は,4バイトで1文字を表します。Unicode(UTF-16)で1文字が2バイトで表される範囲の文字だけ使う場合,COBOL2002のUnicode機能では,PIC Nの日本語項目1けたで1文字を扱うことができます。したがって,サロゲートペア文字を含むデータが格納されるデータ項目は,日本語項目2けたでサロゲートペア文字の1文字を扱うことになる点に注意してください。
  • 手続き部での注意事項
    サロゲートペア文字が格納されるデータ領域が,サロゲートペア文字1文字に対してPIC N(2)の日本語項目2けたで定義されていれば,転記や比較などで問題はありません。
    ただし,文字列中の文字位置を固定で参照・更新されるような処理や,部分参照での文字位置や長さで文字数を意識しているような処理では,サロゲートペア文字1文字に対して日本語項目2けたであることを考慮した処理にする必要があります。
  • テストデバッガでの注意事項
    サロゲートペア文字が格納されたデータ領域を画面に表示する場合,16進で表示させてください。データ属性で表示させた場合,「〓」で表示されます。
  • 上記以外の注意事項
    次に示す機能でサロゲートペア文字を含むデータ値を使用した場合,動作は保証しません。
    ・データコミュニケーション機能
    ・XML連携機能

(2) 文字の長さ

シフトJISとUTF-8の各文字コードの文字の長さの例を次に示します。

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

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

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

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

(例3)
UTF-16でサロゲートペア文字を扱う場合,次の例では3文字を表すのに日本語項目で5けた(10バイト)必要となります。
[図データ]

(例4)
UTF-16でIVS文字を扱う場合,基となる文字(基底文字)に異体字セレクタと呼ばれる4バイトが付加されるため,次の例では3文字を表すのに日本語項目で5けた(10バイト)必要となります。
[図データ]

(例5)
UTF-8でIVS文字を扱う場合,基となる文字(基底文字)に異体字セレクタと呼ばれる4バイトが付加されるため,次の例では3文字を表すのに英数字項目で13けた(13バイト)必要となります。
[図データ]

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

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

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

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

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

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

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

コンパイル例
32bit版PC(x86) COBOL2002の場合
ccbl2002 -UniObjGen sample1.cbl codeconv.lib
64bit版PC(x64) COBOL2002の場合
ccbl2002 -UniObjGen sample1.cbl codeconv64.lib

プログラム例
       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.

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

用途がDISPLAYの項目と,用途がNATIONALの項目との間で変換(転記)する場合,コード変換が必要です。コード変換する方法を次に示します。

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

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

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

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

(9) データの比較

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