サロゲートペアを扱うシステムでは、Rune を使おう
はじめに
絵文字や異体字セレクタ(IVS)などを扱うシステムでは、「1文字 = 1 char」 という前提がすぐに崩れます。
.NET の string は内部的に UTF-16 を採用しているため、Unicode の一部文字は サロゲートペア(2つの char の組み合わせ)で表現されるからです。
その結果、string.Length や s[0] といった処理は「文字数」ではなく「UTF-16 のコードユニット数」になり、絵文字などを正しく1文字として扱えません。