Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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
WCF失败:非法字节序列_C_Linux_Unicode_Locale_Glibc - Fatal编程技术网

WCF失败:非法字节序列

WCF失败:非法字节序列,c,linux,unicode,locale,glibc,C,Linux,Unicode,Locale,Glibc,我正在尝试测试超出BMP范围的Unicode。下面我使用+UD834DF01作为示例字符,并尝试将其转换为多字节字符,但程序失败并显示“非法字节序列”,为什么 #include <stdio.h> #include <wchar.h> #include <locale.h> #include <stdlib.h> #include <limits.h> int main(int argc, const char *argv[]) {

我正在尝试测试超出BMP范围的Unicode。下面我使用+UD834DF01作为示例字符,并尝试将其转换为多字节字符,但程序失败并显示“非法字节序列”,为什么

#include <stdio.h>
#include <wchar.h>
#include <locale.h>
#include <stdlib.h>
#include <limits.h>

int main(int argc, const char *argv[])
{
    setlocale(LC_ALL, ""); // my locale is UTF-8

    wchar_t wc = 0xd834df01;
    char bytes[MB_LEN_MAX] = {0};
    int r = wctomb(bytes, wc);
    if (r > 0) {
        for (int i = 0; i < MB_LEN_MAX; i++)
            printf("0x%x\n", bytes[i]);
    } else {
        perror("fail");
    }

    return 0;
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,const char*argv[]
{
setlocale(LC_ALL,“”;//我的区域设置是UTF-8
wchar_t wc=0xd834df01;
字符字节[MB_LEN_MAX]={0};
int r=wc(字节,wc);
如果(r>0){
对于(int i=0;i
十六进制D834DF01不是有效的Unicode码点;不存在高于十六进制110000的值。一对(两个“代理”代码单元D834和DF01的序列)是代码点U+10D301的编码,该代码点位于专用区域,不是标准字符,但在UTF-8中可有效编码为f4 8d 8c 81。UTF-16在许多Windows、几乎所有Java和其他一些地方都使用


更正:我在脑子里做了代孕转换,然后滑了一个六角体;正如评论所说,在《太玄经》中它实际上是U+1D301。

是说gcc使用wchar____________________________________________0x81@noinput:宽字符/字符串支持主要是您的C库而不是编译器,glibc支持现代Unicode,即UCS-4。关于1D301,您是对的,请参见编辑。