投稿者 snowmansnow  (社会人) 投稿日時 2021/9/29 21:52:18

 こんばんは、るきお様、魔界の仮面弁士様、まこ様
 まこ様の質問に触発されて、異体字・サロゲートペアの勉強を再開してみました。
 xp時代からの、皆さんのwebの情報をもとに自分なりに勉強しています。
 2人のやりとりは、非常に勉強になりました。
 昔の、魔界の仮面弁士様のwebで、フォントにグリフ?が、ある・なしを調べるVB.NETにたどり着き、
 'http://bbs.wankuma.com/index.cgi?mode=al2&namber=79406&KLOG=135
 試してみたくなったのですが、サロゲートペア以上のUTF-16が2つ以上の文字の確認方法というか、
 ContainsKey(値)の、値の渡し方がわかりませんでした。
 確認したいUTF-16が2つ以上の文字の、コードポイントや、UTF-16の文字列は、自分でサンプル抽出できます(下記)
  VBAだと、chrW(a) & chrW(b) & chrW(c) みたいに値を渡すだと思うのですが、
 それがVB.NETのintegerに渡すとなると、どうしたらいいのかわかりません。
 よかったら御教授いただきたいです。

 自分で、サンプル文字のコードなどを確認できる式は、下記で、エクセル2016のVBAです。
 MAINを動かすとサンプル例が表示されます。
 1回で表示できなかったので、2回にわけます

Public SCA1() As String
Public SCA2() As Long
Public SEL1() As String
Public SEL2() As Long

Sub MAIN()

Call IVDINI(A)

Cells(2, 2).VALUE = "通常"
Cells(3, 2).VALUE = "サロゲートペア"
Cells(4, 2).VALUE = "通常異体字"
Cells(5, 2).VALUE = "サロゲートペア異体字"
Cells(6, 2).VALUE = "結合文字"
Cells(7, 2).VALUE = "有るセレクタ"
Cells(8, 2).VALUE = "嘘のセレクタ"

Cells(2, 4).VALUE = "折"
Cells(3, 4).VALUE = uni2(55405, 57158)
Cells(4, 4).VALUE = uni3(33883, 56128, 56576)
Cells(5, 4).VALUE = uni4(55362, 57247, 56128, 56576)
Cells(6, 4).VALUE = uni5(9977, 65039, 8205, 9792, 65039)
Cells(7, 4).VALUE = uni4(55399, 56893, 56128, 56577)
Cells(8, 4).VALUE = uni4(55399, 56893, 56128, 56586)

For y = 2 To 8
Cells(y, 3).FormulaR1C1 = "=IsIVSHEXSCAL(RC[1])"
Next

End Sub

Function IsIVSHEXSCAL(ByVal VALUE)
'http://d.hatena.ne.jp/replication/20091016/1255704497 
  Dim bytes, intI, firstByte, secondByte
  Dim SEL As Long
  Dim SELU As String
  Dim IVSByte() As Long
  Dim c As Long
  bytes = LenB(VALUE) ' バイト数を取得する 
  ReDim IVSByte(Int(bytes / 2) + 1)
  ' バイト数だけ繰り返し 
  IsIVSHEXSCAL = ""
  For intI = 1 To bytes Step 2
    ' 2バイトずつ取り出し 
    IVSByte(Int(intI / 2)) = AscW(MidB(VALUE, intI, 2))
    ' 最後のバイトの場合は、secondByteに0を格納する 
    If intI + 2 < bytes Then
      IVSByte(Int(intI / 2) + 1) = AscW(MidB(VALUE, intI + 2, 2))
    Else
      IVSByte(Int(intI / 2) + 1) = 0
    End If
      IsIVSHEXSCAL = IsIVSHEXSCAL & "U+" & Application.Dec2Hex(ASCW2(IVSByte(Int(intI / 2))), 4) & ","
  Next
    c = Application.WorksheetFunction.unicode(VALUE)
   '異体字セレクタの確認 
   'http://mrxray.on.coocan.jp/Delphi/Others/SurrogatePair.htm 
   If UBound(IVSByte, 1) > 2 Then
     If IVSByte(UBound(IVSByte, 1) - 3) = -9408 Then
     '上位ワードは U + DB40 の固定値 
     
     SEL = Application.Hex2Dec("E0100") + IVSByte(UBound(IVSByte, 1) - 2) + 8960
     'U + E0100 ~ U + E01EF 
     
     SELU = ",U+" & Application.Dec2Hex(SEL) & IVD(c, (IVSByte(UBound(IVSByte, 1) - 2) + 8960))
    Else
     SELU = ""
    End If
   Else
   SELU = ""
   End If
       'https://www.moug.net/tech/exvba/0100035.html 
       IsIVSHEXSCAL = "(" & "U+" & Application.Dec2Hex(c, 6) & SELU & ")" & IsIVSHEXSCAL
End Function