ソートマージ
入力データの文字コード(エンコード)の種別によって,マルチバイト文字の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 |
文字データには,1バイトで比較する「c,j,q」,ワイド文字で比較する「w」,マルチバイトの文字単位の比較をする「u」および「v」の3種類の属性コードを用意しています。
「c」が最も処理効率が高く,「j,q」→「w」→「u,v」の順に処理効率が低下します。キー・項目データを構成する文字コードを確認し,最適な属性コードを指定してください。
表I-4 文字属性コードの特徴
処理速度 | 属性コード | 特徴 | 最適エンコード |
---|---|---|---|
速 ↑ ↓ 遅 |
c |
|
|
j,q |
|
|
|
w |
|
|
|
u,v |
|
|
キー・項目に指定した「+開始バイト位置」から,エンコードに従って文字解析します。
マルチバイト文字の途中を「+開始バイト位置」と指定した場合,そのマルチバイト文字を空白に置き換える端数処理を実行します。端数処理の詳細については,「付録I.2(4) マルチバイト文字の端数処理」を参照してください。また,エンコードが「SJIS」,「EUC-JP」および「EUC-HJ」の場合は,正しく文字解析ができない場合があるので注意してください。
指定された「−バイト長」をエンコードに従って文字解析します。
マルチバイト文字の途中までを「−バイト長」で範囲指定した場合,そのマルチバイト文字を空白に置き換える端数処理を実行します。端数処理の詳細については,「付録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)を仮定する。
テキストファイルとCSVファイルにだけ指定できる属性コード「u」および「v」では,キー・項目の長さを「文字数」で指定します。文字数の最小値は「1」文字で,最大「4,096」文字を指定できます。
なお,属性コード「u」および「v」では,キー・項目の長さを「バイト長」で指定できません。
属性コード「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文字として扱う |
文字単位の比較では,次の表に示す最小構成バイトから比較文字数が決定されます。
表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文字」の比較となります。
文字単位の比較では,比較文字数に満たないデータを入力した場合,右側に空白を加えて比較文字数に調整します。また,比較文字数を超えるデータを入力した場合,右側のあふれ部分は入力しません。
バイト単位の比較では,キー・項目の範囲がマルチバイト文字の途中であった場合,途中の文字を空白文字に置き換える端数処理を実行します。なお,この端数処理によって入力データが変更されることはありません。
属性コードによる端数処理の有無を「表I-7」に,また仮定する文字の種類を「表I-8」に示します。
表I-7 属性コードによる端数処理の有無
属性コード | 途中文字の端数処理の有無 | |
---|---|---|
テキストファイル | CSVファイル※ | |
c | × | ○ |
q | × | × |
j | × | × |
w | × | ○ |
表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 |
− | − | − |
端数処理の例を次に示します。
図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文字目の両方を空白に置き換えます。
入力データのエンコードと属性コードによって,ソート結果が異なる例を次に示します。
図I-7 UTF-16 little endianの例
(ソート結果)
入力レコード番号 | 入力キーデータ | ソート結果 | |||
---|---|---|---|---|---|
+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 |
入力レコード番号 | 入力キーデータ | 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 |
入力レコード番号 | 入力キーデータ | 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 |
入力レコード番号 | 入力キーデータ | 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 |
入力レコード番号 | 入力キーデータ | 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)の例
(ソート結果)
入力レコード番号 | 入力キーデータ | ソート結果 | |||
---|---|---|---|---|---|
+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 |
入力レコード番号 | 入力キーデータ | 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 |
入力レコード番号 | 入力キーデータ | ソート結果 | |||
---|---|---|---|---|---|
+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 |
入力 レコード 番号 |
入力キーデータ | 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)の例
(ソート結果)
入力レコード番号 | 入力キーデータ | ソート結果 | ||||
---|---|---|---|---|---|---|
+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 |
入力レコード番号 | 入力キーデータ | 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 |
入力レコード番号 | 入力キーデータ | ソート結果 | ||||
---|---|---|---|---|---|---|
+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 |
入力 レコード 番号 |
入力キーデータ | 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 |
(凡例)−:該当しません。
同じ意味の漢字文字を複数の字形で表現できる仕組みで,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登録字形)
VS(Variation Selector)は,字体に“バリエーション”をつけるために付随するコードであり,文字データの本質部分ではありません。
文字の意味で分けた場合,前述の図I-10「」と図I-11「
」は同じ文字を指します。また,文字の外観で分けた場合,「
」と「
」は異なる文字となります。
異体字を同字と扱う場合は属性コード「u」を指定します。また,異字と扱う場合は属性コード「v」を指定します。次の図に,属性コードによる比較結果の違いを示します。
図I-13 異体字の比較例
All Rights Reserved. Copyright (C) 2008, 2016, Hitachi, Ltd.