投稿者 るきお  (社会人) 投稿日時 2021/10/2 09:54:55
snowmansnowさん、もう少しポイントを絞っていただくと、話がしやすくなると思います。

ご質問が下記URLの話から始まるので、そもそもはじめてにこのURLを見て、中身を理解する必要があります。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=79406&KLOG=135
これだけでもう時間がかかかります。

何かに依存するのではなく、この投稿だけで話がわかるのようになっていると、取り組みやすいです。
(よくこれを「コンテキストに依存しない」と呼びます。)

悪い例 (コンテキストに依存している)
・以前(2020/4/5)の投稿の件なのですが…
・http://xxxxx/ の件ですが…
・この前相談した、在庫管理システムについてですが…
・前回の続きです。

正直言うと、このようなコンテキスト依存の書き込みは、中身を見る気力がとても低くなります。
以前のことに触れたければ、背景で参考程度に書くのが良いと思います。あくまで参考なので、そのことは知らなくても良いというレベルです。


そして、その後に、Excel VBAで作られた動かない長いプログラムを投稿されていますね。
これは長いだけではなく、具体的に何を聞きたいのかがわからないのでポイントを絞りにくいです。

困っていることを具体的に説明できる最小限のプログラムを投稿するのがセオリーです。
既存のプログラムを切り貼りしてうまく説明できない場合は、投稿用に小さいプログラムを作り直すということをやります。
そのうえで、○○行目でエラーxxxxが発生します。とか、○○行目でこういう処理をしたいのだけれどもそのやり方がわからない という説明をします。

さて、今回の件ですが、
これがやってみたいことでしょうか?
>サロゲートペア以上のUTF-16が2つ以上の文字の確認方法

つまり、ある文字が、Unicodeの第1面で定義されているのか、2面以降で定義されているのかを確認したいということであっていますか?
(サロゲートペアでの表現が必要になるのは、第2面以降なので)

ちなみに、Excelで実現したいのでしょうか?

ひとまず、VB(.NETの方)では次のようにして確認できます。
'▼鯖の場合 
'https://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=%E9%AF%96 

'鯖のコードポイントを を4つのバイトの配列で取得します。 
Dim b1 As Byte() = System.Text.Encoding.UTF32.GetBytes("鯖")

'鯖のコードポイントを 1つの数値で取得します。 
Dim cp1 As Long = b1(0) + b1(1) * 256 + b1(2) * 256 * 256 + b1(3) * 256 * 256 * 256

'16進数での表現も取得しておきます。 
Dim cp1_16 As String = BitConverter.ToString(b1.Reverse.ToArray).Replace("-""")

Debug.WriteLine("鯖のコードポイントは " & cp1 & " = " & cp1_16)

If cp1 <= 65535 Then
    Debug.WriteLine("鯖はUnicode第1面にあります。")
Else
    Debug.WriteLine("鯖はUnicode第2面以降にあります。")
End If

'▼𩸽の場合 
'https://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=%F0%A9%B8%BD 

'𩸽のコードポイントを を4つのバイトの配列で取得します。 
Dim b2 As Byte() = System.Text.Encoding.UTF32.GetBytes("𩸽")

'𩸽のコードポイントを 1つの数値で取得します。 
Dim cp2 As Long = b2(0) + b2(1) * 256 + b2(2) * 256 * 256 + b2(3) * 256 * 256 * 256

'16進数での表現も取得しておきます。 
Dim cp2_16 As String = BitConverter.ToString(b2.Reverse.ToArray).Replace("-""")

Debug.WriteLine("鯖のコードポイントは " & cp2 & " = " & cp2_16)

If cp2 <= 65535 Then
    Debug.WriteLine("𩸽はUnicode第1面にあります。")
Else
    Debug.WriteLine("𩸽はUnicode第2面以降にあります。")
End If


このロジックは、コードポイントを見て、Unicode第1面かそれ以降かを判断しています。
現在、Unicodeのコードポイントを取得する一般的な方法は System.Text.Encoding.UTF32.GetBytes ではないかと思います。
UTF32はUnicodeのコードポイントをそのまま使用する符号化方式なので、UTF32で符号化したものの値を取得するということは、コードポイントを取得するのと同じ意味になります。
(ただ、バイトオーダー(並び順)は人間の感覚と異なるので注意が必要です。)

>Unicode文字の、コードポイント?とUTF-16と異体字セレクタを確認する早見式でした。
コードポイントの取得方法は上述の通りです。
UTF-16で符号化された結果を取得したい場合は、上述の式で UTF32 の代わりに UTF16 を使用します。
異体字セレクタは、コードポイントを調べればわかりますね。

>コードポイント?が2つ?の(あ)異体字と(い)サロゲートペア異体字のフォント内のグリフ?の確認方法を
ここの ? が意味が分からないです。掲示板で文字化けしてしまったでしょうか?
Unihanデータベースを使うとグリフを確認できます。
https://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=%F0%A9%B8%BD

異体字セレクタで具体的にどのような外見が媒体に表示されるかの取得方法はちょっと私にはわかりません。フォント側の対応も必要なので、フォントから指定した文字を取り出すような処理を組む必要があるのではないかと思います。