Можно ли конвертировать текст UTF32 в UTF16, используя только Windows API? - PullRequest
4 голосов
/ 05 июня 2009

Я пытаюсь найти, что преобразование текста UTF-32 в / из любой кодовой страницы возможно, используя только Windows API. Я не могу использовать CLR для выполнения этой задачи.

На странице идентификаторов кодовой страницы в Microsoft по адресу http://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx список UTF-32 доступен только для управляемых приложений.

Сбой ConvertStringTo / FromUnicode при использовании UTF-32.

Ответы [ 3 ]

1 голос
/ 23 июня 2017

Вы можете использовать эту функцию, которая принимает кодовую точку UTF-32 для преобразования в ее эквивалентную кодовую точку UTF-16 (одиночную или суррогатную в зависимости от обстоятельств) в качестве первого аргумента, а суррогаты высокого и низкого значений - в качестве второго и третьего аргументов , Высокие и низкие суррогатные значения возвращаются по ссылке.

Если кодовая точка меньше 0x10000, то мы просто возвращаем эту кодовую точку в нижнем суррогате по ссылке, в то время как верхний суррогат равен 0.

Если кодовая точка больше 0x10000, то мы рассчитываем верхнюю и нижнюю суррогатные пары, используя правила, приведенные на этой странице википедии:

https://en.wikipedia.org/wiki/UTF-16#Example_UTF-16_encoding_procedure

Вот код:

unsigned int convertUTF32ToUTF16(unsigned int cUTF32, unsigned int &h, unsigned int &l)
{
    if (cUTF32 < 0x10000)
    {
        h = 0;
        l = cUTF32;
        return cUTF32;
    }
    unsigned int t = cUTF32 - 0x10000;
    h = (((t<<12)>>22) + 0xD800);
    l = (((t<<22)>>22) + 0xDC00);
    unsigned int ret = ((h<<16) | ( l & 0x0000FFFF));
    return ret;
}
1 голос
/ 05 июня 2009

Обладая небольшим знанием Unicode, вы сможете создавать конвертер UTF32 в UTF16 без использования каких-либо API.

У всех символов в диапазоне от U + 0000 до U + FFFF могут быть просто удалены верхние 16 бит.

Значения в диапазоне от U + 10000 до U + 10FFFF можно преобразовать в два 16-битных слова, называемые суррогатными парами:

http://en.wikipedia.org/wiki/UTF-16#Encoding_of_characters_outside_the_BMP

0 голосов
/ 06 июня 2009

Вы можете использовать библиотеку iconv в Windows. Он полностью поддерживает UTF-32 (с прямым и младшим порядковым номером).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...