投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/10/6 10:46:33
> コードポイント?が2つ?の(あ)異体字と(い)サロゲートペア異体字のフォント内のグリフ?の確認方法を
>  教えて頂きたかったでした。
(あ)異体字というのは SVS のことで、
(い)サロゲートペア異体字とは IVS のことでしょうか?
※ SVS はサロゲートペアを必要とせず、基本多言語面のみで表せるので。

たとえば「車」の異体字割り当てを見ると、下記の 3 つがあります。
3は UTF-16 だとサロゲートペアが必要ですが、1と2はサロゲートペアを必要としません。

① [U+8ECA]          "基底文字"     (CJK UNIFIED IDEOGRAPH-8ECA)
② [U+8ECA][U+FE00]  "標準異体字"   (CJK COMPATIBILITY IDEOGRAPH-F902)
③ [U+8ECA][U+E0100] "Adobe-Japan1" (CID+2306)


この基底文字は基本多言語面(BMP)にあります。
2の異体字セレクタは IVS の [VS1]、3の異体字セレクタは IVS の [VS17] です。


>IPAmj明朝で𩸽は、コードポイント171581ですが、取得できるグリフ番号は、55556ですが、
「文字コード」というよりは、「フォント」の話になりますね。
グリフIDへの変換には、cmap (≒CMap) サブテーブルが使われます。



> CharacterToGlyphMapで取得されるグリフのidで表示される文字が、
> 異体字なら、1個なのか、2個以上なのかを確認したかった、ものです。

Unicode 第0面 (BMP) の U+0000~U+FFFF は Format 4 を参照します。
Unicode 第1面~第16面の U+10000~U+10FFFF は、Format 12 を参照します。
異体字セレクタ(UVS) は Format 14 を参照します。

Format 0: Byte encoding table
Format 2: High-byte mapping through table
Format 4: Segment mapping to delta values
Format 6: Trimmed table mapping
Format 8: mixed 16-bit and 32-bit coverage
Format 10: Trimmed array
Format 12: Segmented coverage
Format 13: Many-to-one range mappings
Format 14: Unicode Variation Sequences

https://aznote.jakou.com/prog/opentype/08_cmap.html
https://www.usefullcode.net/2016/04/11_cmap_from_font_file.html
https://docs.microsoft.com/ja-jp/typography/opentype/spec/cmap?WT.mc_id=DT-MVP-8907#format-14-unicode-variation-sequences
https://developer.apple.com/fonts/TrueType-Reference-Manual/

上記 Azel さんのサイトにも書かれていますが、cmap Format 14 は、
platformID = 0(Unicode) かつ encodingID = 5(Unicode Variation Sequences) が必須です。

UVS マップでは、Unicode値として uint32 あるいは uint24 を扱います。
.NET の Char 型は 16 ビットなので、U+10000 以降の文字を扱う場合は、
検索前に Unicode コードポイントに変換しておいてください。


以前 Gekka さんが、フォントファイルの cmap Format 14 から
異体字セレクタを列挙するコードを MSDN Forum に投稿されていました。
検索条件が Char になっているので、BMP 範囲の基底文字しか拾えませんが
考え方の参考になるかと思います。
https://social.msdn.microsoft.com/Forums/ja-JP/24b83554-2b0b-43ea-a375-39e7b989a571/30064203072338312398199683523912398209861237526041124342594512?forum=vbgeneralja


> 𩸽は、29E3D,E0100~29E3D,E0104

CJK統合漢字拡張漢字「𩸽」の基底文字は [U+29E3D] ですね。(CJK UNIFIED IDEOGRAPH-29E3D)
Unicode 第2面(SIP; 追加漢字面)なので、UTF-16 ではサロゲートペアの範囲。

対応フォントまでは調べていないですが、IVS(異体字シーケンス)の登録はこんな感じでした。

𩸽 [U+29E3D] → 𩸽
𩸽 [U+29E3D], VS17 [U+E0100] → 𩸽󠄀 (Adobe-Japan1: CID+20315)
𩸽 [U+29E3D], VS18 [U+E0101] → 𩸽󠄁 (Adobe-Japan1: CID+15437)
𩸽 [U+29E3D], VS19 [U+E0102] → 𩸽󠄂 (文字情報基盤: MJ055217 ; 汎用電子: JD9344 ; 住基ネット統一文字: J+ABBC)
𩸽 [U+29E3D], VS20 [U+E0103] → 𩸽󠄃 (文字情報基盤: MJ055216 ; 汎用電子: KS523690; 戸籍統一文字: 523690)
𩸽 [U+29E3D], VS21 [U+E0104] → 𩸽󠄄 (文字情報基盤: MJ055218 ; 住基ネット統一文字: J+C01A)