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。
我正在尝试测试 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。