misc.log

日常茶飯事とお仕事と

ユニコードのコード番号から実際の文字を生成する

2013年の2月と7月に、大嫌いな文字コードのお仕事をする羽目になって必死に調べて作業した時の記録を一切公開していなかったので、発掘して残していきます。

いずれC#で書き直したいのですが、とりあえずはVB.NETのコードを切り貼りしてあとで参照できるようにする作業を優先。

ユニコードUnicode)のコード番号*1から文字を生成する

ユニコードのコード番号を列挙し、文字種判定用の自作関数に対してNUnitを使って連続投入、結果のテストを行った際に作成したコードの抜粋です。

'Unicodeコード番号文字列から実際の文字を生成し、Stringに変換する
Dim targetChar As String = System.Convert.ToString(Char.ConvertFromUtf32(System.Convert.ToInt32(charCode, 16)))

コードを表す文字列は「charCode As String」として文字列で引き渡すようにしています。たとえばこんなです。

  • "8033" ……「耳」
  • "8060" ……「聠」
  • "FF61" ……「。」(いわゆる全角の句点)
  • "29E3D" ……「𩸽」(ほっけ…魚+花。いわゆるサロゲートペア文字)

2番目の文字は.NETのエンコーダーでShift-JIS変換しても該当文字は無いうえ、変換後の文字バイト数は化けて1バイトになります。また、4番目のサロゲートペア文字に至っては、Shift-JISで対応する文字は無いうえ、変換すると「??」の2バイトに化けます。さらにいうと、たぶんこのページ上ですら、OSやブラウザによっては表示できていないかもしれません。

何に使ったのか

実際には、この処理はNUnitの「TestCaseSource」機能を用いてObject配列に「テストの説明文」「テスト用文字(この場合はコード文字列)」「期待結果(True/False)」を用意、自動的にNUnitがそれを展開してテストコードにする、という流れの中で利用しました。

あるシステムで顧客データを入力する際に、最終的に汎用機に送りつけるデータのため、結構厳しい文字種チェックが必要でした。しかし、.NETやWindows 7は良くも悪くも「最新の文字種に対応」しているため、オペレーターが入力した文字の中には受け付けられないものが簡単に混じってしまいます。そこで、プロジェクトで自作したチェック関数の動作を確認する必要がありました。さらに、その関数自体が期待通りの動作をすることを確認するため、広域にわたって文字を自動的に入力、結果を判定するテストコードを書きました。

その中で、テスト用文字列を文字コードとして指定し、テスト対象関数に連続投入するために利用したコードです。

プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)

プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)

文字コード「超」研究 改訂第2版

文字コード「超」研究 改訂第2版

*1:Unicodeのコード番号: ここで言うコード番号とは、ユニコードの文字に割り当てた通し番号に相当する「ユニコードスカラ値」の値です。16進数表現で0000~10FFFFまである番号です。