投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/9/6 14:03:05
サロゲートペアの変換ルールについて、まずは下記 URL の記事を読んでみてください。
2003 年当時(Unicode 3.2.0 ~ 4.0.0 頃)の資料ですが、比較的わかりやすいかと思います。
🔹 http://nomenclator.la.coocan.jp/unicode/ucs_utf.htm


変換ルールは上記の URL を見ていただくとして、U+29E3D 「𩸽」は 
 UTF-32LE では 3D 9E 02 00 の 4 バイト
 UTF-32BE では 00 02 9E 3D の 4 バイト
 UTF-16LE では 67 D8 3D DE の 4 バイト ※サロゲートペア:U+D867,U+DE3E
 UTF-16BE では D8 67 DE 3D の 4 バイト ※サロゲートペア:U+D867,U+DE3E
 UTF-8   では F0 A9 B8 BD の 4 バイト
 UTF-7  では 2B 32 47 66 65 50 51 2D の 7 バイト
であらわされることになります。



> そもそも「サロゲート文字」というように「文字」を末尾に付ける表現自体おかしい。
単独で使われる物ではないので、こうした単位を「文字」と呼んで良いのかは確かに微妙ですが、
U+D800~U+DFFF の範囲の文字をサロゲート文字と呼ぶことはあるので、さほどおかしくはないかも。

たとえば .NET には Char.IsSurrogate というメソッドがあるのですが、この戻り値は
 「引数が 0x00D800 以上 0x00DFFF 以下の文字なら true を返し、それ以外は false を返す」
という実装です。Char 構造体を「文字」として捉えるなら、これはサロゲート文字の判定と言えそうです。

前回と説明が被りますが、
U+D800〜U+DBFF までの 1024 個が上位サロゲート(high surrogate)文字で
U+DC00~U+DFFF までの 1024 個が下位サロゲート(low surrogate)文字です。
上位と下位の組であらわされるものをサロゲートペア(代用対; surrogate pair)と呼びます。


U+D800~U+DFFF の範囲は、Unicode (および ISO/IEC 10646) では文字が割り当てられておらず、
サロゲートペア(代用対)にしか使われません。その意味では確かに「文字」と呼ぶのは
微妙なところもあるのですが、.NET の世界だと、この 16bit 単位を System.Char 構造体として
いわゆる文字(Character)と扱ってきたという歴史的な背景もあります(内部表現は UTF-16)ので、
文意によってはこれも文字と言えます。

なお最近は、「U+D7FF 以下の 1 Char」あるいは「サロゲートペアな 2 Char」を一つの単位として、
ルーン(System.Text.Rune 構造体)という用語で扱われることが稀にあります。
https://docs.microsoft.com/en-us/dotnet/api/system.text.rune?view=net-6.0#convert-a-rune-to-utf-8-or-utf-16


> (例えばU+29E3D(ホッケ)は「サロゲート文字」である。)
こちらは正しい表現とは言い難いですね。
『U+29E3D は、(UTF-16 において)サロゲートペアで表現される文字である』、ならば良いかな?

U+29E3D「𩸽」を、文字コードが UTF-16 前提の処理系で扱う場合においては、
結果的にそれがサロゲートペアの U+D867,U+DE3E という組であらわされます。

この時の U+D867 や U+DE3E はサロゲートですので、UTF-16 という条件下に限れば
文意によっては完全に間違いとも言いきれない面はあるのですが…それでもやはり、
U+29E3D をサロゲート文字と呼んでしまうのは、いささか乱暴かなと思います。


> UTF-8では漢字等は3バイトで表現するので
漢字表現が 3 バイトよりもさらに増えることもあります。たとえば異体字。

墓地管理などのため、くさかんむり(艸部)の「艹」「艹」「艹」の違いを表現する必要がある場合に、
Variation Selector を併用した異体字漢字表現が使われることがあります。あとは結合文字とか。
https://ja.wikipedia.org/wiki/%E7%95%B0%E4%BD%93%E5%AD%97%E3%82%BB%E3%83%AC%E3%82%AF%E3%82%BF
https://fontnavi.jp/zakkuri/307-IVS.aspx


先の U+29E3D 「𩸽」でいえば、文字情報基盤整備事業の Moji_Joho コレクション対応フォントだと
 U+29E3D,U+E0102「𩸽󠄂」 MJ055217 {艹}{𠤎}
 U+29E3D,U+E0103「𩸽󠄃」 MJ055216 {艹}{𠤎}
 U+29E3D,U+E0104「𩸽󠄄」 MJ055218 {艹}{匕}
というシーケンスで区別されます。実際の字形は下記 URL の下の方をご覧ください。
https://747.github.io/vsselector/#!/ja/29e3d

上記のそれぞれ、たとえば U+29E3D,U+E0102 を見ると、それ自体はサロゲート文字ではないものの、
それを UTF-16 で符号化すると U+D867,U+DE3D,U+DB40,U+DD02 の 8 バイトになり、
符号化された結果は、 2 組のサロゲートペア(4 つのサロゲート文字)となります。