Точнее, последняя версия С# (С# 12 (.NET 8.0)), использует ли она UTF-8 или UTF-16 для строк?
Я в замешательстве, потому что: https://learn.microsoft.com/en-us/dotnet/standard/base-types/character-encoding-introduction
Логически строка представляет собой последовательность 16-битных значений, каждое из которых является экземпляром структуры char.
И здесь: https://learn.microsoft.com/en-us/dotnet/core/compatibility/globalization/5.0/icu-globalization-api
.NET 5 и более поздние версии используют библиотеки международных компонентов для Юникода (ICU) для функций глобализации при работе в Windows 10 May 2019 Update или более поздней версии.
А что если запустить на Linux? Должен ли я предоставить библиотеку ICU? Или утверждение, что С# по-прежнему использует 16-битные значения, удаляет нули для всех латинских языков и отображает это, чем в ICU?





Кажется, это UTF16:
Сегодня для этого не существует эффективного синтаксиса, поскольку C# представляет все строки с использованием кодировки UTF16.
В C# строки хранятся внутри в кодировке UTF-16. Это означает, что каждый символ строки занимает 16 бит памяти. Строка всегда содержит Unicode (точнее, UTF-16).
Да вы правы.
@MarkTolonen Это все еще UTF-16. Каждый char на самом деле является кодовой точкой, а не символом.
@Charlieface Я знаю, что такое кодовая точка. Вот почему «характер» в кавычках. Я исправляю предложение, в котором говорится: «Каждый символ в строке занимает 16 бит памяти». «Символ» 😊 (одна кодовая точка) занимает 4 байта (2 кодовые единицы UTF-16). «Символ» 👨👩👦👦 (7 кодовых точек) занимает 14 байтов (7 кодовых единиц UTF-16).
К сожалению, исправление, "символ" 👨👩👦👦 (7 кодовых точек) занимает 22 байта (11 кодовых единиц UTF-16). 4 из этих кодовых точек не являются BMP.
Если «символ» не является BMP (> U+FFFF) и не использует суррогаты UTF-16, тогда он использует 32 бита (4 байта) памяти или один визуальный «символ» является графемой из нескольких кодовых точек.