如何使用C映射UTF-16文件中的Unicode代码点

时间:2017-04-22 20:49:00

标签: c unicode utf-16

我需要以二进制模式读取文件,该文件以UTF-16编码编写并将其转换为UNICODE Codepoints。从U + 0000..U + FFFF间隔成功映射代码点我没有任何问题。问题是,从U + 10000到U + 10FFFF,UTF-16编码使用两个部分来形成Codepoint。

示例:此火箭“”以UTF-16编码为0xD83D 0xDE80,形成UNICODE代码点:U + 1F680。

由于UTF-16编码与UNICODE代码点的编号完全相同,从区间U + 0000到U + FFFF,我编写了我的代码,只是将UTF-16读取转换为UNICODE Codepoint。问题在于U + 10000和前进,因为我的程序将第一块(D83D)理解为从U + 0000到U + FFFF的区间。

如何避免此错误?我可以为我的代码做些什么来了解它正在阅读的文章还需要一件才能成功构建UNICODE Codepoint。

提前致谢!

2 个答案:

答案 0 :(得分:2)

您缺少的搜索词是"代理对"。请注意,以下代码不会进行任何错误检查或边界检查。

int next_codepoint(uint16_t *text) {
    int c1 = text[0];
    if (c >= 0xd800 && c < 0xdc00) {
        int c2 = text[1];
        return ((c1 & 0x3ff) << 10) + (c2 & 0x3ff) + 0x10000;
    }
    return c1;
}

在Unicode规范中可以免费获得Unicode规范,以及UTF-16上的维基百科文章。还有许多可用于编解码器转换的库,如iconv。您正在尝试将UTF-16转换为UTF-32,如果这有帮助的话。

答案 1 :(得分:0)

要么进行代理对转换,要么使用为您执行此操作的库,例如iconv libunistring。参见:

render prop https://www.gnu.org/software/libiconv/

示例:

https://www.gnu.org/software/libunistring/