はじめに
Web系雑記: サロゲートペアをJavaScriptで検出する方法にインスパイアされて、サロゲートペアの文字を検出するVBScriptを作成してみました。
サロゲートペアとは
サロゲートペアとは、通称4バイト文字と呼ばれる特殊な文字を表現する方法のことです。サロゲートペアについては、僕が調べた限り、以下の記事が丁寧で分かりやすかったです。
近年、Unicodeに組み込みたいという文字の要望がいろいろと増えてきました。結果的に従来の2バイト(65536文字)では文字が足りない状況になってしまったのです。そこで、解決策としてサロゲートペアという方法が導入されました。これは、「1文字=2バイト」の基本は維持しつつ、一部の文字については「1文字=4バイト」にする方法です。
具体的には、従来のUnicodeでは未使用のだった0xD800〜0xDBFF(1024通り)を「上位サロゲート」、 0xDC00〜0xDFFF(1024通り)を「下位サロゲート」と規定し、「上位サロゲート+下位サロゲート」の4バイトで文字を表現する方法です。
サロゲートペア入門:CodeZine(コードジン)
VBScriptでサロゲートペアの文字を検出する
基本的なロジックは、Web系雑記: サロゲートペアをJavaScriptで検出する方法と同じです。
関数の仕様は、引数で渡された文字列中にサロゲートペアの文字が含まれている場合に、戻り値Trueを返します。どの文字がサロゲートペアに該当するかを特定する場合には、サロゲートペアかどうかの判定部分でその文字列を呼び出し元へ返してやれば良いと思います。その際には、上位サロゲートと下位サロゲートを結合して1文字として扱ってやる必要があります。
Function IsSurrogate(value) Dim bytes, intI, firstByte, secondByte IsSurrogate = False bytes = LenB(value) ' バイト数を取得する ' バイト数だけ繰り返し For intI = 1 To bytes Step 2 ' 2バイトずつ取り出し firstByte = AscW(MidB(value, intI, 2)) ' 最後のバイトの場合は、secondByteに0を格納する If intI + 2 < bytes Then secondByte = AscW(MidB(value, intI + 2, 2)) Else secondByte = 0 End If ' サロゲートペアかどうかの判定 If (&HD800 <= firstByte AND firstByte <= &HDBFF) AND _ (&HDC00 <= secondByte AND secondByte <= &HDFFF) Then IsSurrogate = True Exit Function End If Next End Function
参考サイト
- Windows Vistaで追加となったサロゲートペア文字の一覧
- サロゲートペア文字に対するVBAの標準関数の動作についてまとめられています。