ソートマージ


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

〈この項の構成〉

(1) 文字の長さ

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

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

エンコード種別

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

(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) 開始バイト位置

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

  • エンコードの種類が「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」の場合は,正しく文字解析ができない場合があるので注意してください。

図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

すべてのエンコード

バイト

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) 文字単位比較の端数処理

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

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

エンコード種別

最小構成バイト

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」に示します。

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

属性コード

途中文字の端数処理の有無

テキストファイル

CSVファイル

c

×

q

×

×

j

×

×

w

×

(凡例)

○:端数処理を実行する

×:端数処理を実行しない

注※

CSVファイルの端数処理については,「付録B.2 文字列データの端数処理」もあわせて参照してください。

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

エンコード種別

属性コード

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

(凡例)

−:最小構成バイト単位(2または4バイト)の比較となるので該当しません

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

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

[図データ]

(端数処理)

項番

キー指定値

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

(凡例)

−:該当なし

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

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

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

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

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

[図データ]

(端数処理)

項番

キー指定値

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

(凡例)

−:該当なし

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レコード目

1

c+0-4

B1

B2

B3

B4

82

A0

82

A2

2

c+0-3

B1

B2

B3

82

A0

(20)

(凡例)

−:該当なし

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

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

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

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

[図データ]

(端数処理)

項番

キー指定値

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)

(凡例)

−:該当なし

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

1

74

00

6F

00

2

2

84

FF

8B

FF

3

3

DB

98

5A

9B

4

4

67

D8

49

DE

1

  • キー「c+0-4(キー位置0バイト目,キー長4バイト)」を指定した場合のソート例です。

  • 属性コード「c」はバイト単位で比較します。

  • 入力データのエンコードに「UCS-2LE」または「UTF-16LE」のどちらを指定しても,ソート結果は変わりません。

【例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

注※

EBCDIKコード比較機能「-cmdopt EBCJ」オプションの指定あり。

  • キー「j+0-4(キー位置0バイト目,キー長4バイト)」を指定した場合のソート例です。

  • 属性コード「j」はバイト単位で比較します。

  • 正しくEBCDIK変換できるのは,ASCII対応文字の1番レコードだけです。

  • 入力データのエンコードに「UCS-2LE」または「UTF-16LE」のどちらを指定しても,ソート結果は変わりません。

【例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

  • キー「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文字

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

(凡例)

−:該当しません。

  • キー「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文字

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

(凡例)

−:該当しません。

  • キー「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

1

74

6F

62

69

1

2

EF

BE

84

EF

3

3

E9

A3

9B

E9

2

4

F0

A9

B9

89

4

  • キー「c+0-4(キー位置0バイト目,キー長4バイト)」を指定した場合のソート例です。

  • 属性コード「c」はバイト単位で比較します。

【例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

注※

EBCDIKコード比較機能「-cmdopt EBCJ」オプションの指定あり。

  • キー「j+0-4(キー位置0バイト目,キー長4バイト)」を指定した場合のソート例です。

  • 属性コード「j」はバイト単位で比較します。

  • 正しくEBCDIK変換できるのは,ASCII対応文字の1番レコードだけです。

【例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

  • キー「w+0-4(キー位置0バイト目,キー長4バイト)」を指定した場合のソート例です。

  • UTF-8に指定した属性コード「w」はバイト単位で比較します。また,途中文字を空白(0x20)に置き換える端数処理を実行します。

  • 2番レコードおよび3番レコードのキーデータは2文字目の途中までなので,2文字目を空白に置き換えます。

【例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

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

  • キー「u+0-4(キー位置0バイト目,キー長4文字)」を指定した場合のソート例です。

  • 3番レコードのキーデータは2文字,4番レコードのキーデータは1文字分のデータが入力されたと見なし,不足分に空白(U+0020)を仮定します。

図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

注※

キー位置チェック緩和機能「-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

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

注※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

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

注※

キー位置チェック緩和機能「-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文字

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

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

  • キー「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 異体字の比較例

[図データ]