Строковые и 4-байтовые символы Unicode
У меня есть один вопрос о строках и символах в C#. Я обнаружил, что строка в C# является строкой Unicode, а char занимает 2 байта. Таким образом, каждый символ в кодировке UTF-16. Это здорово, но я также читал в Википедии, что есть некоторые символы, которые в UTF-16 занимают 4 байта.
Я делаю программу, которая позволяет рисовать символы для буквенно-цифровых дисплеев. В программе также есть тестер, где вы можете написать какую-нибудь строку, и она нарисует ее, чтобы вы увидели, как она выглядит.
Итак, как мне работать со строками, когда пользователь пишет символ, который занимает 4 байта, то есть 2 символа. Поскольку мне нужно пройти символ за строкой, найдите этот символ в списке и нарисуйте его на панели.
2 ответа
Вы можете сделать:
for( int i = 0; i < str.Length; ++i ) {
int codePoint = Char.ConvertToUTF32( str, i );
if( codePoint > 0xffff ) {
i++;
}
}
Тогда codePoint
представляет любую возможную кодовую точку как 32-битное целое число.
Работать исключительно с String
объекты; не использовать Char
совсем. Пример использования IndexOf
:
var needle = "ℬ"; // U+1D49D (I think)
var hayStack = "a code point outside basic multi lingual plane: ℬ";
var index = heyStack.IndexOf(needle);
Большинство методов на String
класс имеет перегрузки, которые принимают Char
или же String
, Большинство методов на Char
есть переопределения, которые используют String
также. Просто не используйте Char
,