25.5.2 COUNT-CHAR関数
COUNT-CHAR関数は,引数1に指定された文字列の文字数を返す。この関数の型は,整数とする。
なお,この組み込み関数は,次のどちらかの場合に使用できる。
-
-UniObjGenオプションを指定してコンパイル
-
日本語EUC環境下でコンパイル
-UniObjGenオプションについては,マニュアル「COBOL2002 ユーザーズガイド」またはマニュアル「COBOL2002 使用の手引 手引編」のUnicode機能を参照のこと。
日本語EUC環境については,マニュアル「COBOL2002 使用の手引 手引編」のEUCコードを使用したCOBOLプログラムを参照のこと。
(1) 一般形式
(2) 引数
-
引数1は,字類が英字か英数字,または日本語でなければならない。
-
引数1に可変長集団項目を指定してはならない。
-
引数1に動的長基本項目を指定してはならない。
-
引数1の文字コードは,次のどちらかでなければならない。
字類
文字コード
Unicode機能
日本語EUC環境
英字,英数字
UTF-8
日本語EUC
日本語
UTF-16
-
引数1が英数字集団項目のとき,その従属項目の字類は,英字または英数字でなければならない。
(3) 関数値
-
関数値は,次のとおりである。
- (ア)WIDTHが指定されている場合
-
関数値は引数1の長さを見た目幅で表した整数となる。
- (イ)WIDTHが指定されていない場合
-
関数値は引数1の長さを文字数で表した整数となる。
-
関数値の表現形式は,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が求まる