COBOL2002 ユーザーズガイド
ここでは,転記,文字列操作文などの基本機能での規則について説明します。
シフト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 |
結合文字(例:「か」+「゛」⇒「が」)が格納されている場合は,2文字として扱います。
Unicode機能でのサロゲートペア文字は,次の点を考慮してプログラミングすることで,ユーザデータとして使用できます。なお,IVSの異体字セレクタはサロゲートペア文字で表すため,IVSも同様に注意が必要です。
シフトJISとUTF-8の各文字コードの文字の長さの例を次に示します。
半角かたかなの文字コードの例を次に示します。
全角文字の文字コードの例を次に示します。
空白文字,表意定数SPACE,および転記の空白詰めの文字コードについて,次に示します。
表意定数ZEROの文字コードについて,次に示します。
Unicode機能を使用するプログラム実行時には,用途がDISPLAY/NATIONALの項目に格納される文字データはすべてUTF-8/UTF-16として処理します。たとえば,ファイルから読み込んだレコード項目にシフトJISの文字データが格納されることで,用途がDISPLAY/NATIONALの項目にUTF-8/UTF-16以外の文字データが格納される場合は,コード変換ライブラリを使用して入力データをUTF-8/UTF-16へ変換する必要があります。
コード変換ライブラリを使用してシフトJISの文字データをUTF-8へ変換するコーディング例を次に示します。
ccbl2002 -UniObjGen sample1.cbl codeconv.lib
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.
用途がDISPLAYの項目と,用途がNATIONALの項目との間で変換(転記)する場合,コード変換が必要です。コード変換する方法を次に示します。
CSV編成ファイルを除き,入出力データは無変換とします。入出力データとは,次の機能使用時に入出力されるデータのことです。
シフトJIS範囲外の文字については,16進英数字定数または16進日本語文字定数を使用し,UTF-8またはUTF-16のコード値を直接指定してください。このとき,16進日本語文字定数は,常にUTF-16BEで指定してください。COBOL2002コンパイラは,-UniEndianオプションの指定に従い,16進日本語文字定数の文字コードを変換します。
データの比較は,文字コードによるバイナリ比較となります。そのため,用途がNATIONALの項目または日本語文字定数の大小比較はバイトオーダによって結果が異なります。
All Rights Reserved. Copyright (C) 2013, 2016, Hitachi, Ltd.
All Rights Reserved. Copyright (C) 2002, 2011, Microsoft Corporation.