27.5.1 基本機能
ここでは,転記,文字列操作文などの基本機能での規則について説明します。
- 〈この項の構成〉
(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) 文字の長さ」を参照してください。
説明 |
バイト数 |
けた数※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 |
説明 |
バイト数 |
けた数※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 |
(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) 文字の長さ
文字の長さの例を次に示します。
- (例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,および転記の空白詰めの文字コードについて,次に示します。
-
用途がDISPLAYの場合,UTF-8の半角空白(X'20')を設定します。
-
用途がNATIONALの場合,バイトオーダによって次の文字コードを設定します。
-
バイトオーダがリトルエンディアンの場合,全角空白(X'0030')とします。
-
バイトオーダがビッグエンディアンの場合,全角空白(X'3000')とします。
-
(4) 表意定数ZEROの文字コード
表意定数ZEROの文字コードについて,次に示します。
-
用途がDISPLAYの場合,UTF-8の半角ゼロ(X'30')を設定します。
-
用途がNATIONALの場合,バイトオーダによって次の文字コードを設定します。
-
バイトオーダがUTF-16LEの場合,全角ゼロ(X'10FF')とします。
-
バイトオーダがUTF-16BEの場合,全角ゼロ(X'FF10')とします。
-
(5) 文字コードを変換するプログラム例
Unicode機能を使用するプログラム実行時には,用途がDISPLAY/NATIONALの項目に格納される文字データはすべてUTF-8/UTF-16として処理します。たとえば,ファイルから読み込んだレコード項目にシフトJISの文字データが格納されることで,用途がDISPLAY/NATIONALの項目にUTF-8/UTF-16以外の文字データが格納される場合は,コード変換ライブラリを使用して入力データをUTF-8/UTF-16へ変換する必要があります。
コード変換ライブラリを使用してシフトJISの文字データをUTF-8へ変換するコーディング例を次に示します。
- コンパイル例
-
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.
(6) 用途DISPLAYと用途NATIONALとの間の変換
用途がDISPLAYの項目と,用途がNATIONALの項目との間で変換(転記)する場合,コード変換が必要です。コード変換する方法を次に示します。
-
DISPLAY-OF関数,NATIONAL-OF関数を使用する
-
コード変換ライブラリを使用してUTF-8とUTF-16を相互に変換する
(7) 入出力データの変換
CSV編成ファイルを除き,入出力データは無変換とします。入出力データとは,次の機能使用時に入出力されるデータのことです。
-
ファイル入出力
-
少量入出力(DISPLAY文,ACCEPT文)
-
画面機能(AIXで有効)
-
データベース操作機能(Linuxで有効)
-
サービスルーチン