Строковые и 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,

Другие вопросы по тегам