- [SQL Server 2005]JIS X 0213:2004 対応文字列操作 SQL CLR ユーザー定義関数
ひっそりと公開。(コードなし)
http://www.horae.dti.ne.jp/~ogawa/samples/JapaneseStringManipulate.exe
登録は JapaneseStringManipulate.sql を参考に。
ソースコードは将来公開する予定ですが、現在のところ公開しません。
バグや質問があれば、直接ブログの「連絡する」から連絡してください。
なお「3 つ以上で 1 文字表示する結合文字には対応していません」のでご注意ください。
背景
UNICODE の補助文字(サロゲートペア、16bit + 16bit の 32bit で表す)・結合文字(UNICODE 基本多言語面〈16bit〉の中で、見た目上 1 文字になっているが、実は別々の文字が合成して表示される文字のこと、濁音符記号などが該当する)を SQL Server 2005 の標準文字列関数(LEFT、LEN、REVERSE、RIGHT、STUFF、SUBSTRINGの各関数)で正しく処理できないため、SQL CLR を使った実装が必要になる
処理実装
- 補助文字・結合文字(半角カタカナ濁音記号も含む)・基底文字を文字単位で判定メソッド
- 補助文字・基底文字 + 結合文字(半角カタカナ濁音記号も含む)・基底文字・結合文字単体で分解し、ArrayList 化するメソッド
- JapaneseLeft 関数
JapaneseSubstring 関数に開始位置 1 、JapanseLeft 関数の value 引数、length 引数を渡して、結果を返す
- JapaneseLen 関数
StringInfo.ParseCombiningCharacters で、文字数を取得
半角カタカナ濁音記号も 1 文字とカウントされる
- JapaneseLen2 関数
value 引数を ArrayList 化し、ArrayList.Count の結果を返す
半角カタカナ濁音記号は基底文字が先にあった場合、ArrayList 化するときに基底文字 + 半角カタカナ濁音記号で格納するため、カウントしない
基底文字が先にない場合は半角カタカナ濁音記号も 1 文字としてカウントする
- JapaneseReverse 関数
value 引数を ArrayList 化し、ArrayList.Reverse メソッドで反転し、結果を返す
- JapaneseRight 関数
value 引数を JapaneseReverse 関数で反転し、値を JapaneseLeft 関数の value 引数とし、JapaneseRight 関数の length 引数を渡して左から切り出し、結果を再度反転させて結果を返す
※これがアホな実装の 1 つ
- JapaneseStuff 関数
value 引数を ArrayList 化し、開始位置(start)までは ArrayList 化した文字を格納し、開始位置から削除範囲(length)までは、挿入文字で入れ替え、範囲を超えたらまた ArrayList 化した文字を格納して、結果を返す
- JapaneseSubstring 関数
value 引数を ArrayList 化し、ArrayList を開始位置(start)から文字幅(length)を切り出して結果を返す