【问题标题】:Printing a UTF-32 character to terminal [closed]将 UTF-32 字符打印到终端 [关闭]
【发布时间】:2017-01-15 12:14:22
【问题描述】:

根据此页面,我正在使用回调(使用 glfwSetCharCallback 设置)从 GLFW 读取用户输入: http://www.glfw.org/docs/latest/input.html#input_char

回调函数将按下的键作为 32 位无符号整数接收。如何将其转换为可以在屏幕上打印的内容?我已经尝试过来自 C++11 和 ICU 库的 codecvt,但无法将可读字符打印到我的终端。

这是我的回调函数的代码:

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;
    }

如果我对输入(键)不做任何事情,则什么都不会显示。只是一个空行。

【问题讨论】:

  • 哪些字符有问题?您尝试了哪种转换?你用的是什么操作系统?
  • 我正在寻找的字符是实际的字母(除非我误解了函数),即在键盘上按“e”会将字符“e”发送到回调方法。正如我所说:我已经尝试过 codecvt(来自此示例代码 en.cppreference.com/w/cpp/locale/codecvt )并使用 ICU 库。使用 ICU,我尝试创建两个转换器。一个从 UTF-32 到 Unicode,最后从 Unicode 到 UTF-8。但是,由于 ucnv_toUChars 将 char* 作为输入,并且显式类型转换 unsigned int 不起作用。如果您愿意,我可以重新创建已删除的代码。
  • 另外,我使用的是 Linux。
  • Unicode 是什么意思?您的 Linux 终端窗口是否设置为处理 UTF-8?我相信 ICU 可以将 UTF-32 直接转换为 UTF-8。如果您发布转换代码会有所帮助。
  • 终端应该默认设置为UTF-8,不是吗?我在上面的帖子中添加了我的代码(还注释了导致 ICU 错误的行)。我是否在输入 ucnv_toUChars 错误数据?

标签: c++ unicode glfw utf-32


【解决方案1】:

您正在调用 ucnv_toUChars(),它将 8 位字符串转换为 Unicode。但是您需要另辟蹊径,将您的 Unicode 字符串转换为 8 位,例如 UTF-8。我会使用 UnicodeString 类,它有一个采用 UTF-32 的构造函数和一个 toUTF8String() 方法。

【讨论】:

  • 是的,没错。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 2015-05-23
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多