wctomb 失败:非法字节序列

wctomb fail: Illegal byte sequence

我正在尝试测试 BMP 范围之外的 Unicode。下面我以+UD834DF01为例,尝试将其转换为多字节字符,但程序失败,显示'Illegal byte sequence',为什么?

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

十六进制 D834DF01 不是有效的 Unicode 代码点;没有高于十六进制 110000 的值。 两个的序列)'surrogate'代码单元D834和DF01是代码点U+10D301的UTF-16编码它位于专用区域,不是标准字符,但可以在 UTF-8 中有效编码为 f4 8d 8c 81。UTF-16 用于 Windows 的大部分,几乎所有 Java , 以及其他一些地方。

更正:我在脑海中进行了代理转换并滑倒了一个十六进制;正如评论所说,它实际上是太玄经中的U+1D301 digram for heavenly earth