как преобразовать ucs4 в ucs2 с помощью C и ucs2 в ucs4?

#c #unicode #character-encoding

#c #unicode #кодировка символов

Вопрос:

Есть ли какой-либо метод C , поддерживающий это преобразование? На данный момент я просто заполняю символ ‘0’, чтобы преобразовать ucs2 в ucs4, это безопасно? Спасибо!

Ответ №1:

Это правильно для UCS2, но, скорее всего, это не то, что у вас есть. В настоящее время вы чаще сталкиваетесь с UTF-16. В отличие от UCS-2, UTF-16 кодирует символы Unicode в виде одной или двух 16-битных единиц. Это необходимо, потому что в текущей версии Unicode содержится более 65536 символов.

Более сложные преобразования обычно могут быть выполнены вашей операционной системой, и существует несколько (нестандартных) библиотек, которые предлагают ту же функциональность, например ICU.

Ответ №2:

У меня есть что-то подобное. Надеюсь, это поможет:

 String^ StringFromUCS4(const char32_t* element, int length)
{
    StringBuilder^ result = gcnew StringBuilder(length);
    const char32_t* pUCS4 = element;

    int characterCount = 0;
    while (*pUCS4 != 0)
    {
        wchar_t cUTF16;
        if (*pUCS4 < 0x10000)
        {
            cUTF16 = (wchar_t)*pUCS4;
        }
        else 
        {
            unsigned int t = *pUCS4 - 0x10000;
            unsigned int h = (((t << 12) >> 22)   0xD800);
            unsigned int l = (((t << 22) >> 22)   0xDC00);
            cUTF16 = (wchar_t)((h << 16) | (l amp; 0x0000FFFF));
        }

        result->Append((wchar_t)*pUCS4);

        characterCount  ;
        if (characterCount >= length)
        {
            break;
        }

        pUCS4  ;
    }

    return result->ToString();
}