付録I.2 文字列データの扱い
(1) 文字の長さ
入力データの文字コード(エンコード)の種別によって,マルチバイト文字の1文字の長さは異なります。キー・項目の属性ごとの1文字の長さは,次の表のとおりです。
エンコード種別 |
1文字の長さ(単位:バイト) |
|||
---|---|---|---|---|
c,q |
j |
w |
u,v |
|
ASCII |
1 |
1 |
1 |
1 |
SJIS |
1 |
1 |
1 |
1,2 |
EUC-JP |
1 |
1 |
1 |
1〜3 |
EUC-HJ |
1 |
1 |
1 |
1〜2 |
UTF-8 |
1 |
1 |
1 |
1〜4 |
UCS-2LE |
1 |
1 |
2 |
2 |
UCS-2BE |
1 |
1 |
2 |
2 |
UTF-16LE |
1 |
1 |
2 |
2,4 |
UTF-16BE |
1 |
1 |
2 |
2,4 |
UCS-4LE |
1 |
1 |
4 |
4 |
UCS-4BE |
1 |
1 |
4 |
4 |
UTF-32LE |
1 |
1 |
4 |
4 |
UTF-32BE |
1 |
1 |
4 |
4 |
-
属性コード「w(ワイド文字)」,「u(マルチバイト文字)」および「v(マルチバイト文字)」は,テキストファイルおよびCSVファイルだけで指定できます。
-
属性コード「w」は,UCS-2およびUTF-16を1文字2バイト,UCS-4,およびUTF-32を1文字4バイトで扱う属性です。UCS-2,UCS-4,UTF-16,およびUTF-32以外のエンコードはワイド文字ではないので,文字の最小構成バイトの1文字1バイトとして扱います。
-
属性コード「w」は,サロゲートペア文字を2文字(2文字×2バイト)で扱います。
-
属性コード「u」および「v」は,入力ファイルのエンコード方式に従って,1文字nバイトの可変長で扱います。ただし,ASCII,UCS-2,UCS-4,およびUTF-32は固定長で扱います。
-
属性コード「u」および「v」は,UTF-16のサロゲートペア文字を1文字(4バイト)で扱います。
-
属性コード「u」および「v」は,UnicodeのVS(Variation Selector,異体字セレクタ)を文字数に数えません。
-
属性コード「u」は,UnicodeのIVS(Ideographic Variation Sequence)の異体字を同じ文字として扱います。属性コード「v」は,UnicodeのIVSの異体字を異なる文字として扱います。
(2) 文字属性コードの特徴
文字データには,1バイトで比較する「c,j,q」,ワイド文字で比較する「w」,マルチバイトの文字単位の比較をする「u」および「v」の3種類の属性コードを用意しています。
「c」が最も処理効率が高く,「j,q」→「w」→「u,v」の順に処理効率が低下します。キー・項目データを構成する文字コードを確認し,最適な属性コードを指定してください。
属性コード |
特徴 |
最適エンコード |
---|---|---|
c |
|
|
j,q |
|
|
w |
|
|
u,v |
|
|
-
属性コード「c」は,文字構成やエンディアンを考慮しないので,ASCII,JIS8単位コード,UCS-2,UCS-4などの固定長の文字コードの入力データに最適です。big endianのUCS-2,little endianのUCS-2とUCS-4の場合は,キー・項目範囲の入力データがASCII対応コード(英数字)だけで構成されていることが条件です。
-
属性コード「j」は,EBCDIKコードの体系に従った並び順にしたい場合に,EBCDIKコード比較オプション機能(-cmdopt EBCJ,EBCE)と一緒に使用します。EBCDIKコード比較オプション機能を指定していない場合は,属性「c」と同じです。
-
属性コード「q」は,JIS8単位コード体系以外の並び順にしたい場合に,文字順序変更機能(-altseqパラメタ)と一緒に使用します。
-
属性コード「w」は,ワイド文字のエンディアン正規化を実施するので,little endianのUCS-2,UCS-4,UTF-32の入力データに最適です。特に,キー・項目範囲の入力データが日本語などのASCII対応コード以外で構成されている場合,正しく比較するためには「w」を使用しなければなりません。
-
属性コード「u」と「v」は,文字構成を考慮した文字単位の比較を行うため,SJIS,EUC-JP,EUC-HJ,UTF-8,UTF-16などの,可変長の文字コードの入力データに最適です。特にUTF-16のサロゲートペア文字を1文字として扱いたい場合は「u」または「v」を使用しなければなりません。
-
属性コード「u」は,UnicodeのIVS(Ideographic Variation Sequence)の異体字を同じ文字として扱います。逆に,属性コード「v」は,UnicodeのIVSの異体字を異なる文字として扱います。Unicode以外のエンコードの場合,またはUnicodeのIVSがない場合,属性コード「u」と「v」の違いはありません。IVSについては,「付録I.2(6) IVS対応」を参照してください。
(3) キー・項目の開始位置と長さの指定
(a) 開始バイト位置
キー・項目に指定した「+開始バイト位置」から,エンコードに従って文字解析します。
-
エンコードの種類が「UCS-2LE」,「UCS-2BE」,「UTF-16LE」または「UTF-16BE」の場合は「2の倍数」を開始バイト位置に指定してください。
-
エンコードの種類が「UCS-4LE」,「UCS-4BE」,「UTF-32LE」または「UTF-32BE」の場合は「4の倍数」を開始バイト位置に指定してください。
-
エンコードの種類が上記以外の場合は,開始バイト位置の制約はありません。
マルチバイト文字の途中を「+開始バイト位置」と指定した場合,そのマルチバイト文字を空白に置き換える端数処理を実行します。端数処理の詳細については,「付録I.2(4) マルチバイト文字の端数処理」を参照してください。また,エンコードが「SJIS」,「EUC-JP」および「EUC-HJ」の場合は,正しく文字解析ができない場合があるので注意してください。
(b) バイト長
指定された「−バイト長」をエンコードに従って文字解析します。
-
エンコードの種類が「UCS-2LE」,「UCS-2BE」,「UTF-16LE」または「UTF-16BE」の場合は「2の倍数」をバイト長に指定してください。
-
エンコードの種類が「UCS-4LE」,「UCS-4BE」,「UTF-32LE」または「UTF-32BE」の場合は「4の倍数」をバイト長に指定してください。
-
エンコードの種類が上記以外の場合は,バイト長の制約はありません。
マルチバイト文字の途中までを「−バイト長」で範囲指定した場合,そのマルチバイト文字を空白に置き換える端数処理を実行します。端数処理の詳細については,「付録I.2(4) マルチバイト文字の端数処理」を参照してください。また,エンコードが「SJIS」,「EUC-JP」および「EUC-HJ」の場合は,正しく文字解析ができない場合があるので注意してください。
1.文字「も(0x82E0)」の先頭からキーとして指定。
2.文字「も」の途中からキーとして指定。第2バイトの「0xE0」をShift_JISの第1バイトと解釈し,1バイトずつずれて解析されるので,正しく解釈できない。
3.文字「た(0x82BD)」の途中までをキーとして指定。第1バイトの「0x82」はASCII文字以外なので空白(0x20)を仮定する。
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」は,文字単位で比較します。
属性コード |
エンコード種別 |
比較単位 |
備考 |
---|---|---|---|
c,j,q |
すべてのエンコード |
バイト |
− |
w |
ASCII,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) 文字単位比較の端数処理
文字単位の比較では,次の表に示す最小構成バイトから比較文字数が決定されます。
エンコード種別 |
最小構成バイト |
---|---|
ASCII,SJIS,EUC-JP,EUC-HJまたはUTF-8 |
1 |
UCS-2LE,UCS-2BE,UTF-16LEまたはUTF-16BE |
2 |
UCS-4LE,UCS-4BE,UTF-32LEまたはUTF-32BE |
4 |
例えば,エンコード「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」に示します。
属性コード |
途中文字の端数処理の有無 |
|
---|---|---|
テキストファイル |
CSVファイル※ |
|
c |
× |
○ |
q |
× |
× |
j |
× |
× |
w |
× |
○ |
エンコード種別 |
属性コード |
||
---|---|---|---|
q,j |
c,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 |
− |
− |
− |
端数処理の例を次に示します。
(端数処理)
項番 |
キー指定値 |
1レコード目 |
2レコード目 |
||||||
---|---|---|---|---|---|---|---|---|---|
1 |
j+0-4 |
B1 |
B2 |
B3 |
B4 |
82 |
A0 |
82 |
A2 |
2 |
j+0-3 |
B1 |
B2 |
B3 |
− |
82 |
A0 |
82 |
− |
3 |
j+1-3 |
B2 |
B3 |
B4 |
− |
A0 |
82 |
A2 |
− |
4 |
j+1-2 |
B2 |
B3 |
− |
− |
A0 |
82 |
− |
− |
(端数処理)
項番 |
キー指定値 |
1レコード目 |
2レコード目 |
||||||
---|---|---|---|---|---|---|---|---|---|
1 |
c+0-4 |
B1 |
B2 |
B3 |
B4 |
82 |
A0 |
82 |
A2 |
2 |
c+0-3 |
B1 |
B2 |
B3 |
− |
82 |
A0 |
82 |
− |
3 |
c+1-3 |
B2 |
B3 |
B4 |
− |
A0 |
82 |
A2 |
− |
4 |
c+1-2 |
B2 |
B3 |
− |
− |
A0 |
82 |
− |
− |
(端数処理)
項番 |
キー指定値 |
1レコード目 |
2レコード目 |
||||||
---|---|---|---|---|---|---|---|---|---|
1 |
c+0-4 |
B1 |
B2 |
B3 |
B4 |
82 |
A0 |
82 |
A2 |
2 |
c+0-3 |
B1 |
B2 |
B3 |
− |
82 |
A0 |
(20) |
− |
(端数処理)
項番 |
キー指定値 |
1レコード目 |
2レコード目 |
||||||
---|---|---|---|---|---|---|---|---|---|
1 |
w+0-4 |
B1 |
B2 |
B3 |
B4 |
82 |
A0 |
82 |
A2 |
2 |
w+0-3 |
B1 |
B2 |
B3 |
− |
82 |
A0 |
(20) |
− |
3 |
w+1-3 |
B2 |
B3 |
B4 |
− |
(20) |
82 |
A2 |
− |
4 |
w+1-2 |
B2 |
B3 |
− |
− |
(20) |
(20) |
− |
− |
(5) ソート結果例
入力データのエンコードと属性コードによって,ソート結果が異なる例を次に示します。
(ソート結果)
- 【例1】属性コード「c」のソート結果
-
入力レコード番号
入力キーデータ
ソート結果
+0
+1
+2
+3
1
74
00
6F
00
2
2
84
FF
8B
FF
3
3
DB
98
5A
9B
4
4
67
D8
49
DE
1
- 【例2】属性コード「j」のソート結果
-
入力レコード番号
入力キーデータ
EBCDIK変換※
ソート結果
+0
+1
+2
+3
+0
+1
+2
+3
1
74
00
6F
00
8B
00
75
00
2
2
84
FF
8B
FF
FF
FF
FF
FF
4
3
DB
98
5A
9B
BB
FF
E9
FF
3
4
67
D8
49
DE
67
AE
C9
BE
1
- 【例3】属性コード「w」のソート結果
-
入力レコード番号
入力キーデータ
Unicode比較
ソート結果
+0〜1
+2〜3
1文字
2文字
1
7400
6F00
U+0074
U+006F
1
2
84FF
8BFF
U+FF84
U+FF8B
4
3
DB98
5A9B
U+98DB
U+9B5A
2
4
67D8
49DE
U+D867
U+DE49
3
- 【例4】属性コード「u」のソート結果(codetype=UCS-2LE指定)
-
入力レコード番号
入力キーデータ
Unicode比較
ソート結果
1文字
2文字
3文字
4文字
1文字
2文字
3文字
4文字
1
7400
6F00
6200
6900
U+0074
U+006F
U+0062
U+0069
1
2
84FF
8BFF
9EFF
73FF
U+FF84
U+FF8B
U+FF9E
U+FF73
4
3
DB98
5A9B
−
−
U+98DB
U+9B5A
(U+0020)
(U+0020)
2
4
67D8
49DE
−
−
U+D867
U+DE49
(U+0020)
(U+0020)
3
- 【例5】属性コード「u」のソート結果(codetype=UTF-16LE指定)
-
入力レコード番号
入力キーデータ
Unicode比較
ソート結果
1文字
2文字
3文字
4文字
1文字
2文字
3文字
4文字
1
7400
6F00
6200
6900
U+0074
U+006F
U+0062
U+0069
1
2
84FF
8BFF
9EFF
73FF
U+FF84
U+FF8B
U+FF9E
U+FF73
3
3
DB98
5A9B
−
−
U+98DB
U+9B5A
(U+0020)
(U+0020)
2
4
67D8
49DE
−
−
−
U+29E49
(U+0020)
(U+0020)
(U+0020)
4
図I‒8 UTF-8文字(codetype=UTF-8)の例
(ソート結果)
- 【例1】属性コード「c」のソート結果
-
入力レコード番号
入力キーデータ
ソート結果
+0
+1
+2
+3
1
74
6F
62
69
1
2
EF
BE
84
EF
3
3
E9
A3
9B
E9
2
4
F0
A9
B9
89
4
- 【例2】属性コード「j」のソート結果
-
入力レコード番号
入力キーデータ
EBCDIK変換※
ソート結果
+0
+1
+2
+3
+0
+1
+2
+3
1
74
6F
62
69
8B
75
62
69
1
2
EF
BE
84
EF
FF
8F
FF
FF
4
3
E9
A3
9B
E9
FF
43
FF
FF
2
4
F0
A9
B9
89
FF
49
89
FF
3
- 【例3】属性コード「w」のソート結果
-
入力レコード番号
入力キーデータ
ソート結果
+0
+1
+2
+3
1
74
6F
62
69
1
2
EF
BE
84
(20)
3
3
E9
A3
9B
(20)
2
4
F0
A9
B9
89
4
- 【例4】属性コード「u」のソート結果
-
入力
レコード
番号
入力キーデータ
Unicode比較
ソート結果
1文字
2文字
3文字
4文字
1文字
2文字
3文字
4文字
1
74
6F
62
69
U+0074
U+006F
U+0062
U+0069
1
2
EFBE84
EFBE8B
EFBE9E
EFBDB3
U+FF84
U+FF8B
U+FF9E
U+FF73
3
3
E9A39B
E9AD9A
−
−
U+98DB
U+9B5A
(U+0020)
(U+0020)
2
4
F0A9B989
−
−
−
U+29E49
(U+0020)
(U+0020)
(U+0020)
4
図I‒9 日本語EUC文字(codetype=EUC-JP)の例
(ソート結果)
- 【例1】属性コード「c」のソート結果
-
入力レコード番号
入力キーデータ
ソート結果
+0
+1
+2
+3
+4
1
74
6F
62
69
75
1
2
8E
C4
8E
CB
8E
2
3
C8
F4
B5
FB
(00)※
4
4
8F
FD
DD
(00)※
(00)※
3
- 【例2】属性コード「j」のソート結果
-
入力レコード番号
入力キーデータ
EBCDIK変換※2
ソート結果
+0
+1
+2
+3
+4
+0
+1
+2
+3
+4
1
74
6F
62
69
75
8B
75
62
69
9B
1
2
8E
C4
8E
CB
8E
FF
95
FF
9E
FF
3
3
C8
F4
B5
FB
(00)※1
99
FF
85
FF
00
2
4
8F
FD
DD
(00)※1
(00)※1
FF
FF
BD
00
00
4
- 【例3】属性コード「w」のソート結果
-
入力レコード番号
入力キーデータ
ソート結果
+0
+1
+2
+3
+4
1
74
6F
62
69
75
1
2
8E
C4
8E
CB
(20)
2
3
C8
F4
B5
FB
(00)※
4
4
8F
FD
DD
(00)※
(00)※
3
- 【例4】属性コード「u」のソート結果
-
入力
レコード
番号
入力キーデータ
EUC-JP比較
ソート
結果
1文字
2文字
3文字
4文字
5文字
1文字
2文字
3文字
4文字
5文字
1
74
6F
62
69
75
74
6F
62
69
75
1
2
8EC4
8ECB
8EDE
8EB3
8EB5
8EC4
8ECB
8EDE
8EB3
8EB5
2
3
C8F4
B5FB
−
−
−
C8F4
B5FB
(20)
(20)
(20)
3
4
8FFDDD
−
−
−
−
8FFDDD
(20)
(20)
(20)
(20)
4
(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-11にある「葛」+VS(U+E0102)を並べた文字符号列を「IVS」と呼びます。この文字は「葛」と同一文字であり,ほかのグリフも存在します(図I-12参照)。