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