プログラミング逆引き辞典

~ 多言語対応のプログラミングレシピ ~

C# 上位サロゲート・下位サロゲートの求め方

「辻󠄀」という文字(しんにょうが1つ)は辻の異体字である
「辻󠄀」をUnicodeで表現すると「U+8FBBU+E0100」となる
「U+E0100」の部分がIVSで、異体字を表す文字列となっている
 
このIVSから「U+」を除いたものを上位サロゲート・下位サロゲートに変換する方法
 
 

//文字コードをセット ※頭に「0x」を付けて16進数であることを明示
var unicode = 0xE0100;

// 文字コードから0x10000を引く
unicode -= 0x10000;

// 文字コードを「0x400」で割る ※戻り値はdecimal型
decimal temp = unicode / 0x400;

// 整数値に変換 ※併せてint型にキャスト
var hightSur = (int)Math.Floor(temp);  //Math.floor()で整数値に変換

// 「0xD800」を足した値が上位サロゲートの10進数
hightSur += 0xD800;

// 16進数の文字列に変換した上位サロゲート
var hightSur16 = hightSur.ToString("X");

// 文字コードから0x10000を引いた値を「0x400」で割った余り
var lowSur = unicode % 0x400;

// 余りに「0xDC00」を足した値が下位サロゲートの10進数
lowSur += 0xDC00;

// 16進数の文字列に変換した下位サロゲート
var lowSur16 = lowSur.ToString("X");