小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


VBScriptでサロゲートペアの文字を検出する方法

はじめに

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

参考サイト