Печать символа UTF-32 на терминале

Я читаю пользовательский ввод из GLFW с помощью обратных вызовов (устанавливается с помощью glfwSetCharCallback) в соответствии с этой страницей: http://www.glfw.org/docs/latest/input.html

Функция обратного вызова получает нажатую клавишу как 32-разрядное целое число без знака. Как я могу преобразовать это в то, что я могу напечатать на моем экране? Я пробовал и codecvt из C++11, и библиотеку ICU, но не смог заставить что-либо печатать читаемые символы на моем терминале.

Это код моей функции обратного вызова:

void InputManager::charInputCallback(GLFWwindow* window, unsigned int key)
    {
        UErrorCode errorStatus = U_ZERO_ERROR; //initialize to no error
        UConverter *utf32toUnicode = ucnv_open("UTF-32", &errorStatus); //create converter utf-32 <=> Unicode
        if(U_FAILURE(errorStatus))
            std::cout << u_errorName(errorStatus) << std::endl;
        UChar unicode[10] = {0};
        ucnv_toUChars(utf32toUnicode, unicode, 10, (char*)key, 4, &errorStatus); // this fails with an U_ILLEGAL_ARGUMENT_ERROR
        if(U_FAILURE(errorStatus))
            std::cout << u_errorName(errorStatus) << std::endl;

        std::cout << unicode << std::endl;
    }

Если я ничего не делаю с вводом (ключом), ничего не отображается вообще. Просто пустая строка.

1 ответ

Решение

Вы вызываете ucnv_toUChars(), который преобразует 8-битную строку в Unicode. Но вам нужно пойти другим путем и преобразовать строку Unicode в 8-битную, например UTF-8. Я бы использовал класс UnicodeString, который имеет конструктор, принимающий UTF-32, и метод toUTF8String().

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