付録I.2 文字列データの扱い

<この項の構成>
(1) 文字の長さ
(2) 文字属性コードの特徴
(3) キー・項目の開始位置と長さの指定
(4) マルチバイト文字の端数処理
(5) ソート結果例
(6) IVS対応

(1) 文字の長さ

入力データの文字コード(エンコード)の種別によって,マルチバイト文字の1文字の長さは異なります。キー・項目の属性ごとの1文字の長さは,次の表のとおりです。

表I-3 エンコードと属性コードの関係

エンコード種別1文字の長さ(単位:バイト)
c,qjwu,v
ASCII1111
SJIS1111,2
EUC-JP1111~3
EUC-HJ1111~2
UTF-81111~4
UCS-2LE1122
UCS-2BE1122
UTF-16LE1122,4
UTF-16BE1122,4
UCS-4LE1144
UCS-4BE1144
UTF-32LE1144
UTF-32BE1144

(2) 文字属性コードの特徴

文字データには,1バイトで比較する「c,j,q」,ワイド文字で比較する「w」,マルチバイトの文字単位の比較をする「u」および「v」の3種類の属性コードを用意しています。

「c」が最も処理効率が高く,「j,q」→「w」→「u,v」の順に処理効率が低下します。キー・項目データを構成する文字コードを確認し,最適な属性コードを指定してください。

表I-4 文字属性コードの特徴

処理速度属性コード特徴最適エンコード

 
 
 
 
 

 
 
 
 
 

 
 
 
 
 
c
  • 1文字1バイトの最も単純な比較を実施します。
  • マルチバイト文字の文字構成や,エンディアンは考慮しません。
  • ASCIIコード
  • JIS8単位コード
  • UCS-2BE
  • UCS-4BE
  • UTF-32BE
j,q
  • 1文字1バイトで並び順序を変換して比較します。
  • マルチバイト文字の文字構成や,エンディアンは考慮しません。
  • ASCIIコード
  • JIS8単位コード
w
  • UCS-2,UCS-4,UTF-16,およびUTF-32は,2バイトおよび4バイトのワイド文字として比較します。また,little endianのエンコードは,big endianに正規化して比較します。
  • UCS-2,UCS-4,UTF-16およびUTF-32以外は,1文字1バイトで比較します。属性コード「c」と同じです。
  • UCS-2LE
  • UCS-4LE
  • UTF-32LE
u,v
  • ASCIIは,1文字1バイトで比較します。属性コード「c」と同じです。
  • SJISは,1バイト文字を2バイトに引き伸ばし,文字単位(1文字2バイト)の比較を行います。
  • EUC-JPは,1バイト文字および2バイト文字を3バイトに引き伸ばし,文字単位(1文字3バイト)の比較を行います。
  • EUC-HJは,1バイト文字を2バイトに引き伸ばし,文字単位(1文字2バイト)の比較を行います。
  • UCS-2とUCS-4は,2バイトおよび4バイトのワイド文字として比較します。また,little endianのエンコードは,big endianに正規化して比較します。属性コード「w」と同じです。
  • UTF-16は,Unicode(U+0000~U+10FFFFの値)にデコードし,文字単位(1文字4バイト)の比較を行います。
  • SJIS
  • EUC-JP
  • EUC-HJ
  • UTF-8
  • UTF-16LE
  • UTF-16BE

(3) キー・項目の開始位置と長さの指定

(a) 開始バイト位置

キー・項目に指定した「+開始バイト位置」から,エンコードに従って文字解析します。

マルチバイト文字の途中を「+開始バイト位置」と指定した場合,そのマルチバイト文字を空白に置き換える端数処理を実行します。端数処理の詳細については,「付録I.2(4) マルチバイト文字の端数処理」を参照してください。また,エンコードが「SJIS」,「EUC-JP」および「EUC-HJ」の場合は,正しく文字解析ができない場合があるので注意してください。

(b) バイト長

指定された「-バイト長」をエンコードに従って文字解析します。

マルチバイト文字の途中までを「-バイト長」で範囲指定した場合,そのマルチバイト文字を空白に置き換える端数処理を実行します。端数処理の詳細については,「付録I.2(4) マルチバイト文字の端数処理」を参照してください。また,エンコードが「SJIS」,「EUC-JP」および「EUC-HJ」の場合は,正しく文字解析ができない場合があるので注意してください。

図I-1 開始バイト位置によって文字の解釈が異なる例(Shift_JIS)

[図データ]

1.文字「も(0x82E0)」の先頭からキーとして指定。

2.文字「も」の途中からキーとして指定。第2バイトの「0xE0」をShift_JISの第1バイトと解釈し,1バイトずつずれて解析されるので,正しく解釈できない。

3.文字「た(0x82BD)」の途中までをキーとして指定。第1バイトの「0x82」はASCII文字以外なので空白(0x20)を仮定する。

図I-2 開始バイト位置によって文字の解釈が異なる例(EUC-JP)

[図データ]

1.文字「や(0xA4E4)」の先頭からキーとして指定。

2.文字「や」の途中からキーとして指定。第2バイトの「0xE4」をEUC-JPの第1バイトと解釈し,1バイトずつずれて解析されるので,正しく解釈できない。5バイト目の「0xC0」はASCII文字以外なので空白(0x20)を仮定する。

3.文字「だ(0xA4C0)」の途中までをキーとして指定。第1バイトの「0xA4」はASCII文字以外なので空白(0x20)を仮定する。

(c) 文字数

テキストファイルとCSVファイルにだけ指定できる属性コード「u」および「v」では,キー・項目の長さを「文字数」で指定します。文字数の最小値は「1」文字で,最大「4,096」文字を指定できます。

なお,属性コード「u」および「v」では,キー・項目の長さを「バイト長」で指定できません。

(4) マルチバイト文字の端数処理

(a) 文字の比較単位

属性コード「c,j,q」は,指定したエンコードに関係なく1バイト単位で比較します。

ASCII,SJIS,EUC-JP,EUC-HJおよびUTF-8に指定した属性コード「w」は,1バイト単位で比較します。

属性コード「u,v」と,UCS-2,UCS-4,UTF-16およびUTF-32に指定した属性コード「w」は,文字単位で比較します。

表I-5 文字の比較単位

属性コードエンコード種別比較単位備考
c,j,qすべてのエンコードバイト
wASCII,SJIS,EUC-JP,EUC-HJ,またはUTF-8バイト
UCS-2LE,UCS-2BE,UTF-16LE,またはUTF-16BE文字UTF-16のサロゲートペア文字は2文字として扱う
UCS-4LE,UCS-4BE,UTF-32LE,またはUTF-32BE文字
u,vすべてのエンコード文字UTF-16のサロゲートペア文字は1文字として扱う
(凡例)
-:該当なし

(b) 文字単位比較の端数処理

文字単位の比較では,次の表に示す最小構成バイトから比較文字数が決定されます。

表I-6 1文字の最小構成バイト

エンコード種別最小構成バイト
ASCII,SJIS,EUC-JP,EUC-HJまたはUTF-81
UCS-2LE,UCS-2BE,UTF-16LEまたはUTF-16BE2
UCS-4LE,UCS-4BE,UTF-32LEまたはUTF-32BE4

例えば,エンコード「UTF-8」でキー長5バイトの属性コード「w」を指定した場合,UTF-8の最小構成バイトは「1バイト」なので「5÷1=5文字」の比較となります。

なお,「UCS-2」,「UCS-4」,「UTF-16」および「UTF-32」では,最小構成バイトの倍数でキー・項目の長さを指定しなければなりません。

エンコードが「UCS-2LE」,「UCS-2BE」,「UTF-16LE」または「UTF-16BE」のときは,「2の倍数」の長さを指定します。

エンコードが「UCS-4LE」,「UCS-4BE」,「UTF-32LE」または「UTF-32BE」のときは,「4の倍数」の長さを指定します。

例えば,エンコード「UCS-2LE」でキー長8バイトの属性コード「w」を指定した場合,UCS-2LEの最小構成バイトは「2バイト」なので「8÷2=4文字」の比較となります。

文字単位の比較では,比較文字数に満たないデータを入力した場合,右側に空白を加えて比較文字数に調整します。また,比較文字数を超えるデータを入力した場合,右側のあふれ部分は入力しません。

(c) バイト単位比較の端数処理

バイト単位の比較では,キー・項目の範囲がマルチバイト文字の途中であった場合,途中の文字を空白文字に置き換える端数処理を実行します。なお,この端数処理によって入力データが変更されることはありません。

属性コードによる端数処理の有無を「表I-7」に,また仮定する文字の種類を「表I-8」に示します。

表I-7 属性コードによる端数処理の有無

属性コード途中文字の端数処理の有無
テキストファイルCSVファイル
c×
q××
j××
w×
(凡例)
○:端数処理を実行する
×:端数処理を実行しない
注※
CSVファイルの端数処理については,「付録B.2 文字列データの端数処理」もあわせて参照してください。

表I-8 仮定する文字の種類

エンコード種別属性コード
q,jc,w
CSVファイルCSVファイル以外
ASCII
SJIS
EUC-JP
EUC-HJ
UTF-8
文字の置き換えなし空白(0x20)文字の置き換えなし
UCS-2LE
UCS-2BE
UCS-4LE
UCS-4BE
UTF-16LE
UTF-16BE
UTF-32LE
UTF-32BE
(凡例)
-:最小構成バイト単位(2または4バイト)の比較となるので該当しません

端数処理の例を次に示します。

図I-3 バイト単位比較の端数処理の例(codetype=SJISの属性コード「j」指定)

[図データ]

(端数処理)

項番キー指定値1レコード目2レコード目
1j+0-4B1B2B3B482A082A2
2j+0-3B1B2B382A082
3j+1-3B2B3B4A082A2
4j+1-2B2B3A082
(凡例)
-:該当なし

属性コード「j」は端数処理を実行しません。

項番2の2レコード目のキー末尾は上位バイトの「0x82」が残ります。

項番3の2レコード目のキー先頭は下位バイトの「0xA0」が残ります。

項番4の2レコード目のキー先頭は下位バイトの「0xA0」が,キー末尾は上位バイトの「0x82」が残ります。


図I-4 バイト単位比較の端数処理の例(CSVファイル以外のcodetype=SJISの属性コード「c」指定)

[図データ]

(端数処理)

項番キー指定値1レコード目2レコード目
1c+0-4B1B2B3B482A082A2
2c+0-3B1B2B382A082
3c+1-3B2B3B4A082A2
4c+1-2B2B3A082
(凡例)
-:該当なし

CSVファイル以外の属性コード「c」は端数処理を実行しません。属性コード「j」と同じ結果となります。詳細については,「図I-1 開始バイト位置によって文字の解釈が異なる例(Shift_JIS)」を参照してください。

項番2の2レコード目のキー末尾は上位バイトの「0x82」が残ります。

項番3の2レコード目のキー先頭は下位バイトの「0xA0」が残ります。

項番4の2レコード目のキー先頭は下位バイトの「0xA0」が,キー末尾は上位バイトの「0x82」が残ります。


図I-5 バイト単位比較の端数処理の例(CSVファイルのcodetype=SJISの属性コード「c」指定)

[図データ]

(端数処理)

項番キー指定値1レコード目2レコード目
1c+0-4B1B2B3B482A082A2
2c+0-3B1B2B382A0(20)
(凡例)
-:該当なし

CSVファイルの属性コード「c」は端数処理を実行します。途中文字を空白(0x20)に置き換えます。

なお,CSVのセルデータは,左端をそろえて入力するので,CSVキー・項目範囲の左側が途中文字となることはありません。

項番2の2レコード目のキー末尾は2文字目の途中なので,2文字目を空白に置き換えます。


図I-6 バイト単位比較の端数処理の例(codetype=SJISの属性コード「w」指定)

[図データ]

(端数処理)

項番キー指定値1レコード目2レコード目
1w+0-4B1B2B3B482A082A2
2w+0-3B1B2B382A0(20)
3w+1-3B2B3B4(20)82A2
4w+1-2B2B3(20)(20)
(凡例)
-:該当なし

SJISに対する属性コード「w」は端数処理を実行します。途中文字を空白(0x20)に置き換えます。

項番2の2レコード目のキー末尾は2文字目の途中なので,2文字目を空白に置き換えます。

項番3の2レコード目のキー先頭は1文字目の途中なので,1文字目を空白に置き換えます。

項番4の2レコード目のキー先頭と末尾はどちらも文字の途中なので,1文字目と2文字目の両方を空白に置き換えます。


(5) ソート結果例

入力データのエンコードと属性コードによって,ソート結果が異なる例を次に示します。

図I-7 UTF-16 little endianの例

[図データ]

(ソート結果)

【例1】属性コード「c」のソート結果
入力レコード番号入力キーデータソート結果
+0+1+2+3
174006F002
284FF8BFF3
3DB985A9B4
467D849DE1
  • キー「c+0-4(キー位置0バイト目,キー長4バイト)」を指定した場合のソート例です。
  • 属性コード「c」はバイト単位で比較します。
  • 入力データのエンコードに「UCS-2LE」または「UTF-16LE」のどちらを指定しても,ソート結果は変わりません。

【例2】属性コード「j」のソート結果
入力レコード番号入力キーデータEBCDIK変換ソート結果
+0+1+2+3+0+1+2+3
174006F008B0075002
284FF8BFFFFFFFFFF4
3DB985A9BBBFFE9FF3
467D849DE67AEC9BE1
注※
EBCDIKコード比較機能「-cmdopt EBCJ」オプションの指定あり。
  • キー「j+0-4(キー位置0バイト目,キー長4バイト)」を指定した場合のソート例です。
  • 属性コード「j」はバイト単位で比較します。
  • 正しくEBCDIK変換できるのは,ASCII対応文字の1番レコードだけです。
  • 入力データのエンコードに「UCS-2LE」または「UTF-16LE」のどちらを指定しても,ソート結果は変わりません。

【例3】属性コード「w」のソート結果
入力レコード番号入力キーデータUnicode比較ソート結果
+0~1+2~31文字2文字
174006F00U+0074U+006F1
284FF8BFFU+FF84U+FF8B4
3DB985A9BU+98DBU+9B5A2
467D849DEU+D867U+DE493
  • キー「w+0-4(キー位置0バイト目,キー長4バイト)」を指定した場合のソート例です。
  • 属性コード「w」は文字単位で比較します。
  • UCS-2の最小構成バイトは2バイトなので,比較文字数は「4÷2=2文字」です。
  • UCS-2では,4番レコードのサロゲートペア文字「[図データ]」を2文字として扱います。
  • 入力データのエンコードに「UCS-2LE」または「UTF-16LE」のどちらを指定しても,ソート結果は変わりません。

【例4】属性コード「u」のソート結果(codetype=UCS-2LE指定)
入力レコード番号入力キーデータUnicode比較ソート結果
1文字2文字3文字4文字1文字2文字3文字4文字
174006F0062006900U+0074U+006FU+0062U+00691
284FF8BFF9EFF73FFU+FF84U+FF8BU+FF9EU+FF734
3DB985A9BU+98DBU+9B5A(U+0020)(U+0020)2
467D849DEU+D867U+DE49(U+0020)(U+0020)3
(凡例)
-:該当しません。
  • キー「u+0-4(キー位置0バイト目,キー長4文字)」を指定した場合のソート例です。
  • 属性コード「u」は文字単位で比較します。
  • UCS-2では,4番レコードのサロゲートペア文字「[図データ]」を2文字として扱います。
  • 3番と4番レコードのキーデータは2文字分のデータが入力されたと見なし,不足分に空白(U+0020)を仮定します。
  • 属性コード「w」と同じソート結果となります。

【例5】属性コード「u」のソート結果(codetype=UTF-16LE指定)
入力レコード番号入力キーデータUnicode比較ソート結果
1文字2文字3文字4文字1文字2文字3文字4文字
174006F0062006900U+0074U+006FU+0062U+00691
284FF8BFF9EFF73FFU+FF84U+FF8BU+FF9EU+FF733
3DB985A9BU+98DBU+9B5A(U+0020)(U+0020)2
467D8
49DE
U+29E49(U+0020)(U+0020)(U+0020)4
(凡例)
-:該当しません。
  • キー「u+0-4(キー位置0バイト目,キー長4文字)」を指定した場合のソート例です。
  • 属性コード「u」は文字単位で比較します。
  • UTF-16では,4番レコードのサロゲートペア文字「[図データ]」を1文字として扱います。
  • 3番レコードのキーデータは2文字,4番レコードのキーデータは1文字分のデータが入力されたと見なし,不足分に空白(0x20)を仮定します。

図I-8 UTF-8文字(codetype=UTF-8)の例

[図データ]

(ソート結果)

【例1】属性コード「c」のソート結果
入力レコード番号入力キーデータソート結果
+0+1+2+3
1746F62691
2EFBE84EF3
3E9A39BE92
4F0A9B9894
  • キー「c+0-4(キー位置0バイト目,キー長4バイト)」を指定した場合のソート例です。
  • 属性コード「c」はバイト単位で比較します。

【例2】属性コード「j」のソート結果
入力レコード番号入力キーデータEBCDIK変換ソート結果
+0+1+2+3+0+1+2+3
1746F62698B7562691
2EFBE84EFFF8FFFFF4
3E9A39BE9FF43FFFF2
4F0A9B989FF4989FF3
注※
EBCDIKコード比較機能「-cmdopt EBCJ」オプションの指定あり。
  • キー「j+0-4(キー位置0バイト目,キー長4バイト)」を指定した場合のソート例です。
  • 属性コード「j」はバイト単位で比較します。
  • 正しくEBCDIK変換できるのは,ASCII対応文字の1番レコードだけです。

【例3】属性コード「w」のソート結果
入力レコード番号入力キーデータソート結果
+0+1+2+3
1746F62691
2EFBE84(20)3
3E9A39B(20)2
4F0A9B9894
  • キー「w+0-4(キー位置0バイト目,キー長4バイト)」を指定した場合のソート例です。
  • UTF-8に指定した属性コード「w」はバイト単位で比較します。また,途中文字を空白(0x20)に置き換える端数処理を実行します。
  • 2番レコードおよび3番レコードのキーデータは2文字目の途中までなので,2文字目を空白に置き換えます。

【例4】属性コード「u」のソート結果
入力
レコード
番号
入力キーデータUnicode比較ソート結果
1文字2文字3文字4文字1文字2文字3文字4文字
1746F6269U+0074U+006FU+0062U+00691
2EFBE84EFBE8BEFBE9EEFBDB3U+FF84U+FF8BU+FF9EU+FF733
3E9A39BE9AD9AU+98DBU+9B5A(U+0020)(U+0020)2
4F0A9B989U+29E49(U+0020)(U+0020)(U+0020)4

(凡例)-:該当しません。

  • キー「u+0-4(キー位置0バイト目,キー長4文字)」を指定した場合のソート例です。
  • 3番レコードのキーデータは2文字,4番レコードのキーデータは1文字分のデータが入力されたと見なし,不足分に空白(U+0020)を仮定します。

図I-9 日本語EUC文字(codetype=EUC-JP)の例

[図データ]

(ソート結果)

【例1】属性コード「c」のソート結果
入力レコード番号入力キーデータソート結果
+0+1+2+3+4
1746F6269751
28EC48ECB8E2
3C8F4B5FB(00)4
48FFDDD(00)(00)3
注※
キー位置チェック緩和機能「-cmdopt POSNOCHK」オプションの指定あり。
  • キー「c+0-5(キー位置0バイト目,キー長5バイト)」を指定した場合のソート例です。
  • 属性コード「c」はバイト単位で比較します。
  • キー位置チェック緩和機能の指定があると,キーデータが不足していてもエラーにしません。3番レコードおよび4番レコードの不足バイトにNULL値(0x00)を仮定します。

【例2】属性コード「j」のソート結果
入力レコード番号入力キーデータEBCDIK変換※2ソート結果
+0+1+2+3+4+0+1+2+3+4
1746F6269758B7562699B1
28EC48ECB8EFF95FF9EFF3
3C8F4B5FB(00)※199FF85FF002
48FFDDD(00)※1(00)※1FFFFBD00004
注※1
キー位置チェック緩和機能「-cmdopt POSNOCHK」オプションの指定あり。
注※2
EBCDIKコード比較機能「-cmdopt EBCJ」オプションの指定あり。
  • キー「j+0-5(キー位置0バイト目,キー長5バイト)」を指定した場合のソート例です。
  • 属性コード「j」はバイト単位で比較します。
  • キー位置チェック緩和機能の指定があると,キーデータが不足していてもエラーにしません。3番レコードおよび4番レコードの不足分にNULL値(0x00)を仮定します。
  • 正しくEBCDIK変換できるのは,ASCII対応文字の1番レコードだけです。

【例3】属性コード「w」のソート結果
入力レコード番号入力キーデータソート結果
+0+1+2+3+4
1746F6269751
28EC48ECB(20)2
3C8F4B5FB(00)4
48FFDDD(00)(00)3
注※
キー位置チェック緩和機能「-cmdopt POSNOCHK」オプションの指定あり。
  • キー「w+0-5(キー位置0バイト目,キー長5バイト)」を指定した場合のソート例です。
  • EUC-JPに指定した属性コード「w」はバイト単位で比較します。また,途中文字を空白(0x20)に置き換える端数処理を実行します。
  • 2番レコードのキーデータは3文字目の途中までなので,3文字目を空白に置き換えます。
  • キー位置チェック緩和機能の指定があると,キーデータが不足していてもエラーにしません。3番レコードおよび4番レコードの不足分にNULL値(0x00)を仮定します。

【例4】属性コード「u」のソート結果
入力
レコード
番号
入力キーデータEUC-JP比較ソート
結果
1文字2文字3文字4文字5文字1文字2文字3文字4文字5文字
1746F626975746F6269751
28EC48ECB8EDE8EB38EB58EC48ECB8EDE8EB38EB52
3C8F4B5FBC8F4B5FB(20)(20)(20)3
48FFDDD8FFDDD(20)(20)(20)(20)4

(凡例)-:該当しません。

  • キー「u+0-5(キー位置0バイト目,キー長5文字)」を指定した場合のソート例です。
  • 属性コード「u」は文字単位で比較します。
  • 3番レコードのキーデータは2文字,4番レコードのキーデータは1文字分のデータを入力されたと見なし,不足分に空白(0x20)を仮定します。

(6) IVS対応

(a) IVSとは

同じ意味の漢字文字を複数の字形で表現できる仕組みで,ISO/IEC 10646で規定されています。漢字を表すコードの直後にVS(Variation Selector,字形選択子)と呼ばれるコードを付加することで,その漢字の「異体字」を表現する方法です。

VSの範囲としてサロゲートエリア内の「U+E0100~U+E01EF」が割り当てられており,UTF-16ではサロゲートペアでVSが表現されます。漢字を表すコードを「基底文字(Base Character)」と呼び,基底文字に付随するVSとあわせて「U+hhhhh;U+E01hh」と表現します。

同一文字コードの漢字でも,VSによってグリフ(印刷・画面表示イメージ)が異なる例を次の図に示します。

図I-10 VS(Variation Selector)なし「かつしかく」

[図データ]

図I-11 VS(Variation Selector)あり「かつらぎし」

[図データ]

図I-11にある「葛」+VS(U+E0102)を並べた文字符号列を「IVS」と呼びます。この文字は「葛」と同一文字であり,ほかのグリフも存在します(図I-12参照)。

図I-12 U+845BのVS例(IVD登録字形)

[図データ]

(b) SORT EEでのIVSの扱い

VS(Variation Selector)は,字体に“バリエーション”をつけるために付随するコードであり,文字データの本質部分ではありません。

文字の意味で分けた場合,前述の図I-10[図データ]」と図I-11[図データ]」は同じ文字を指します。また,文字の外観で分けた場合,「[図データ]」と「[図データ]」は異なる文字となります。

異体字を同字と扱う場合は属性コード「u」を指定します。また,異字と扱う場合は属性コード「v」を指定します。次の図に,属性コードによる比較結果の違いを示します。

図I-13 異体字の比較例

[図データ]