misc.log

日常茶飯事とお仕事と

VB.NETでのサロゲートペア文字の取り扱い

文字のチェック処理を扱う必要が出てきたのでテストデータを作っているのですが、サロゲートペアがどのように扱われるかについて勘違いしていました。

たとえば、U+29E3D、「ほっけ(魚+花)」という文字ですが、これはプログラム中では以下のように取り扱われるようです。

  • Lengthプロパティは2(2文字扱い)
  • shift_jisに変換すると「??」(1バイト?が2つ)
  • 見た目は1文字

文字数とかの確認でこういう文字を扱うときは注意が必要ですね。上記のようにshift_jis変換してバイト数を数えると2バイトになるのも要注意です(4バイトかと思ってた)。

参考

ユニコード文字列のバイト数を数える(shift_jis変換後のバイト数)。

'カウント対象文字がinputString変数に入っていると想定
byteLength = System.Text.Encoding.GetEncoding("shift_jis").GetByteCount(inputString)

ユニコードの番号指定で文字を文字列変数に入れる。この場合、上記の「ほっけ」は

'ホッケという文字を出す場合
target = System.Convert.ToString(Char.ConvertFromUtf32(
    System.Convert.ToInt32("29E3D", 16)))

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

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