COBOL2002 言語 拡張仕様編


25.5.2 COUNT-CHAR関数

COUNT-CHAR関数は,引数1に指定された文字列の文字数を返す。この関数の型は,整数とする。

なお,この組み込み関数は,次のどちらかの場合に使用できる。

-UniObjGenオプションについては,マニュアル「COBOL2002 ユーザーズガイド」またはマニュアル「COBOL2002 使用の手引 手引編」のUnicode機能を参照のこと。

日本語EUC環境については,マニュアル「COBOL2002 使用の手引 手引編」のEUCコードを使用したCOBOLプログラムを参照のこと。

〈この項の構成〉

(1) 一般形式

[図データ]

(2) 引数

  1. 引数1は,字類が英字か英数字,または日本語でなければならない。

  2. 引数1に可変長集団項目を指定してはならない。

  3. 引数1に動的長基本項目を指定してはならない。

  4. 引数1の文字コードは,次のどちらかでなければならない。

    字類

    文字コード

    Unicode機能

    日本語EUC環境

    英字,英数字

    UTF-8

    日本語EUC

    日本語

    UTF-16

  5. 引数1が英数字集団項目のとき,その従属項目の字類は,英字または英数字でなければならない。

(3) 関数値

  1. 関数値は,次のとおりである。

    (ア)WIDTHが指定されている場合

    関数値は引数1の長さを見た目幅で表した整数となる。

    (イ)WIDTHが指定されていない場合

    関数値は引数1の長さを文字数で表した整数となる。

  2. 関数値の表現形式は,2進形式4バイト(64bit版COBOL2002では2進形式8バイト)となる。

(4) 使用例(Unicode機能)

(a) シフトJISでの文字数の取得

シフトJISでは,バイト数,文字数,けた数の関係が決まっている。英数字項目は半角1文字を1バイトで1けた,日本語項目は全角1文字を2バイトで1けたである。そのため,文字数を意識したプログラミングは比較的に容易である。

例えば,次のように3けたの英数字項目に格納されている半角の文字数は3文字,3けたの日本語項目に格納されている文字数は3文字である。

   01 TEST-DATAX PIC X(10) VALUE 'アイウ'.
   *> 3文字
   01 TEST-DATAN PIC N(3) VALUE N'あいう'.
   *> 3文字

次のデータ項目の後ろ空白を除いた文字数を求める文の例を示す。

   01 TEST-DATA1 PIC X(10) VALUE 'アイウ'.

[図データ]

記述例

[図データ]

(b) Unicodeでの文字数の取得

Unicodeの場合は,文字数とけた数の関係が定まらないため,けた数から文字数を容易に求めることができない。そこで,引数に指定されたUnicodeのデータ項目の文字数を返すCOUNT-CHAR関数を使用する。

COUNT-CHAR関数を使用して,次のUTF-8のデータ項目の後ろ空白を除いた文字数を求める文の例を示す。

   01 TEST-DATA1 PIC X(10) VALUE 'アイウ'.
記述例

[図データ]

(c) Unicodeでの見た目幅の取得

シフトJISでは,英数字項目にLENGTH関数を適用すると,けた数が返る。英数字項目では1けたは半角1文字分となる。また,全角日本語は2けたを占めるため,半角2文字分となる。

Unicodeでは,COUNT-CHAR関数を英数字項目に適用し,引数のWIDTHを指定した場合,半角文字での見た目幅が返却される。COUNT-CHAR関数を使用することで,英数字項目の場合,シフトJISと同様に見た目幅で扱うことができるため,既存のシフトJISを前提としたプログラムからの移行が容易となる。

シフトJISの場合とUnicodeの場合とで,次のデータ項目の見た目幅を取得する文の例を示す。

   01 TEST-DATA1 PIC X(8) VALUE 'AあC'.
   *> "あ"は,見た目幅2

[図データ]

記述例

[図データ]

(5) 使用例(日本語EUC環境)

英数字項目に格納された半角文字の文字数を求める場合,シフトJISと日本語EUCでは,それぞれ次の例に示すコーディングとなる。

(a) シフトJISでの半角文字の文字数および見た目幅の取得

シフトJISの場合,半角文字は1バイトの固定である。そのため,英数字項目に格納された文字列の文字数と見た目幅は等しくなり,LENGTH関数で容易に求められる。

(例)

       01 TEST-DATA1 PIC X(10) VALUE 'アイウ'. *> 3文字を格納
              :
           *> 半角文字の文字数および見た目幅を求める
           COMPUTE NUMOFCHAR = 
                FUNCTION LENGTH(FUNCTION TRIM(TEST-DATA1 TRAILING)). 
                *> 3が求まる

(b) 日本語EUCでの半角文字の文字数および見た目幅の取得

日本語EUCの場合,半角かたかなが1文字2バイトとなる。そのため,シフトJISと同じ方法では見た目幅も文字数も求められない。

日本語EUCでは,LENGTH関数の代わりにCOUNT-CHAR関数を使用することで文字数を求められる。

(例)

       01 TEST-DATA1 PIC X(10) VALUE 'アイウ'. *> 3文字を格納
              :
           *> 半角文字の文字数を求める
           COMPUTE NUMOFCHAR = 
                FUNCTION COUNT-CHAR(FUNCTION TRIM(TEST-DATA1 TRAILING)).
                *> 3が求まる