Jak długa jest kupa (💩) w C# ?

Co wyświetli program?
string shit = "💩";
Console.WriteLine(shit.Length);
Oczywiście nie jest to 1.
Program wyświetli 2, ponieważ string.Length liczy ile string posiada char’ów, a każdy Char reprezentuje jedno słowo [1] UTF-16. Do pokazania potrzeba dwóch ‘słów’.
[1] Przez słowo rozumiem 16 bitów na których kodowany jest znak UTF-16
UTF-16 to jeden z sposobów kodowania Unicode. W skrócie Unicode to wielka tablica gdzie liczbom przypisane są znaki. UTF-16 jeden z sposobów na zapisanie tych liczb na najmniejszej przestrzeni. Inny popularny standard kodowania znaków to UTF-8 gdzie ‘słowo’ jest o połowę krótsze. Gdyby w C# i .NET Char reprezentowałby pojedyncze słowo UTF-8 to miałaby długość 4.
Dlaczego mam się przejmować?
Azja i emoji! Jeżeli twój program ma wspierać rynek azjatycki to cała logika np. ograniczająca ilość wpisywanych znaków może zacząć płatać figle. I tak właściwość MaxLength, którą ustawia się w WPF’ie, powoduje że użytkownik może wprowadzić tylko połowę tego co ustawiliśmy.
Jak żyć?
StringInfo na ratunek.
var si = new StringInfo(shit);
Console.WriteLine(si.LengthInTextElements);
LengthInTextElements
zwraca ilość faktycznych znaków.
Wow świat uratowany? Nie tak prędko. Jeżeli założyliśmy MaxLength na kolumnie w bazie danych. Możemy w ten sposób przepuścić więcej danych niż się tego spodziewamy. Baza danych też jakoś informacje o znakach koduje w jakimś formacie.
Ikona
Poop by Jordan Díaz Andrés from the Noun Project