投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/10/7 23:06:29
>> Public Function ToUTF16
> は、言語が何なのか?試せませんでした・・・

失礼いたしました。
Visual Basic 14.0 以降向けのコードです。

NameOf 演算子が使われていることから、VB2015 以上が必要です。
とはいえ NameOf(codePage) は、文字列 "codePage" と完全に同義なので、
VB2013 以下の場合は、文字列にそのまま置き換えてください。

NameOf の事を知らない場合でも、Throw ステートメントが存在することや、
『If codePage < 0 OrElse &H10FFFF < codePage Then』の行を見ることで、
少なくとも VB.NET であることは、おそらく予想いただけていたものと思います。
VBA や VBScript では、Or はあっても OrElse はありませんからね。

さらに言えば、Function の戻り値の型が『As UShort()』であったことから、
最初の一行だけ見ても、少なくとも VB2005 以上が対象だと判定することができます。
ちなみに、VB.NET 2002/2003 でも動かそうとするのであれば、
As UShort を As UInt16 と書き換えて、CUShort(x) を UInt16.Parse(x) にしたうえで、
最後の『Return {us, ls}』は、『Return New UInt32() {us, ls}』で置き換えます。


>> Gekka さんのコードを参考にして、「𩸽」の文字を試してみました。
> これが、知りたかった話なのですが、
Gekka さんのソース、ほぼそのままですよ。

やっていることは、フォントファイルのバイナリを解析しているだけなので、
ロジック的には、VBA でも実装可能です。


> これを導いたコードは、御教授いただけないでしょうか?
コード全文は長いので省きますが、

①Option Strict On 対応にするために、結構な手直しが必要でした。
 修正箇所が多いので仔細は省略しますが、
 Option Strict Off であれば、ほぼそのまま動くかもしれません。

②TTC クラスの FindFont メソッドは、フォント名から *.ttf/*.ttc を検索するものです。
 うまく検索できない場合があったので、その場合には
  Return New System.IO.FileInfo("C:\Users\Y2\AppData\Local\Microsoft\Windows\Fonts\ipamjm.ttf")
 のように固定パスで FileInfo を返すようにすれば、とりあえず先に進むかと。

③肝となるのが  Public Shared Function FindISV なわけですが、元のコードでは
 ByVal targetChar As Char な引数を受け取り、CUInt(AscW(targetChar)) を渡しています。
 これだと、サロゲートペアを処理できないので、メソッドを Overloads して、
 ByVal targetChar As UInteger を受け取るメソッドをもう一つ用意してみてください。
 そして、このメソッドに "𩸽" を渡すのではなく、そのコードポイントとなる
 &H29E3DUI を引き渡すようにします。


ちなみに、フォームのタイトルバーに書いた情報は、.ttf ファイルのプロパティを見て
書き写したものですが、この情報をプログラムから取得したいのであれば、
TTF クラスの Names プロパティから取得できます。(Gekka さんのコードでは
TTF クラスの IVSMap プロパティしか参照していませんが、Names も読み取れるように実装されています)