サロゲートペア文字列の扱いについて

Unicodeで扱う文字の中には、「サロゲートペア」と呼ばれるものがあります。
サロゲートペアとは、Windows Vistaより扱うことができるようになった漢字のうちの一部なのですが、特徴として「1文字4バイト」であることが挙げられます。
Unicodeは通常「1文字2バイト」なのですが、世界中のいろいろな言語の文字をUnicodeで表現しようとする動きが進むうちに、2バイトでは足りなくなったというのが背景にあるそうです。
サロゲートペア文字の例としては「𩸽」(ほっけ、魚へんに花)があります。

プログラムでサロゲートペア文字を含む文字列の処理を行う場合、注意しなくてはならない点があります。
例えばVB.NET上で、
 Debug.Print(Len("𩸽"))
とすると、1ではなく2が表示されます。
 Debug.Print(Mid("𩸽あいう", 1, 1))
などとやると、「?」が表示されてしまいます。

サロゲートペア文字を含む文字列のX文字目を取得したい」という場合は、以下のような関数を作ってみるとよい…かもしれません。
Public Function MidSurrogatePair(ByVal Target As String, _
ByVal Start As Integer, _
ByVal Length As Integer) As String
Dim liCur As Integer '文字カーソル
Dim liNum As Integer
Dim liTmp As Short
Dim lcStr(0) As String
Dim lcTmp As String
Dim liCnt As Integer
liCur = 1
liNum = 0
lcStr(0) = ""
Do Until liCur > Len(Target)
Redim Preserve lcStr(liNum)
If liCur = Len(Target) Then '最後の文字の場合
liTmp = 1
Else
If Char.IsSurrogatePair(Target.Chars(liCur - 1), Target.Chars(liCur)) Then
liTmp = 2 'サロゲートペア
Else
liTmp = 1
End If
End If
lcStr(liNum) = Mid(Target, liCur, liTmp)
liCur = liCur + liTmp
liNum = liNum + 1
Loop
lcTmp = ""
For liCnt = Start To Start + Length - 1
lcTmp &= lcStr(liCnt - 1)
Next
MidSurrogatePair = lcTmp
End Function
※・Targetが改行コードを含む場合
 ・Targetに対するStart、Lengthの値が適切かのチェック
 ・Lengthの指定を省略したい
 …等の処理は適宜加えてください

Debug.Print(MidSurrogatePair("𩸽あいう", 1, 1))
【出力結果】
𩸽

余談ですが、最近では携帯電話の絵文字もUnicodeで扱う動きが進んでいるそうです。サロゲートペアと違いこちらは広く誰にでも使われるものなので、より文字コードを意識したプログラミングをする機会が増えてくるのかなと感じています。

今回のブログは、私が開発に携わった下記プロジェクトの調査結果を元に掲載しています。

→ 漢文作成システム(http://msystm.co.jp/user_kyoiku.html

【株式会社 エム・システム】
本      社  :〒124-0023 東京都葛飾東新小岩8-5-5 5F
           TEL : 03-5671-2360 / FAX : 03-5671-2361
盛岡事業所  :〒020-0022 岩手県盛岡市大通3-2-8 3F
           TEL : 019-656-1530 / FAX : 019-656-1531
E-mail    : n_shimoda@msystm.co.jp 
URL     : http://msystm.co.jp/
ブログ       : http://d.hatena.ne.jp/msystem/ 
Facebook   : http://www.facebook.com/msysteminc