Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用C从UTF-16文件映射Unicode代码点_C_Unicode_Utf 16 - Fatal编程技术网

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

如何使用C从UTF-16文件映射Unicode代码点,c,unicode,utf-16,C,Unicode,Utf 16,我需要读取以UTF-16编码编写的二进制模式的文件,并将其转换为UNICODE码点。成功地从U+0000..U+FFFF间隔映射代码点没有问题。问题是,从U+10000到U+10FFFF UTF-16编码使用两个片段来形成码点 示例:这个火箭“您缺少的搜索词是“代理项对”。请注意,下面的代码没有执行任何错误检查或边界检查 int next_codepoint(uint16_t *text) { int c1 = text[0]; if (c >= 0xd800 &&

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


示例:这个火箭“您缺少的搜索词是“代理项对”。请注意,下面的代码没有执行任何错误检查或边界检查

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;
}
int下一个码点(uint16\u t*text){
int c1=文本[0];
如果(c>=0xd800&&c<0xdc00){
int c2=文本[1];

return((c1&0x3ff)执行代理项对转换,或使用为您执行此操作的库,如iconv libunistring。请参阅:

例如:


这是错误的:“UTF-16编码与从U+0000到U+FFFF的UNICODE码点的数字完全相同”。UTF-16 0xD800到0xDFFF表示UNICODE U+10000。此处的“+0x1000”应为“+0x10000”。