我想不出一种方法来删除前导零.我的目标是for循环,然后创建每个数字的UTF-8和UTF-32版本.
例如,使用UTF-8不是必须删除前导零?有没有人有解决方案如何解决这个问题?基本上我要问的是:有人有一个简单的解决方案将Unicode代码点转换为UTF-8吗?
for (i = 0x0; i < 0xffff; i++) {
printf("%#x \n", i);
//convert to UTF8
}
Run Code Online (Sandbox Code Playgroud)
所以这里是我想要为每个人完成的一个例子i.
基本上我试图这样做,每个i都将它转换为UTF-8中的十六进制等效.
我遇到的问题似乎是将Unicode转换为UTF-8的过程涉及从位数中删除前导0.我不确定如何动态地做到这一点.
如Wikipedia UTF-8页面所述,每个Unicode代码点(0到0x10FFFF)以UTF-8字符编码为一到四个字节.
这是一个简单的示例函数,从我之前的一篇文章中编辑过.我现在也U从整数常量中删除了后缀.(...的目的是提醒人类程序员,由于某种原因显然是无符号的常量(负代码点根本没有考虑),并且它确实假设unsigned int code- 编译器不关心,可能因为这个即使对于这里的长期成员来说,练习似乎很奇怪也很混乱,所以我放弃并停止尝试包含这样的提醒.:()
static size_t code_to_utf8(unsigned char *const buffer, const unsigned int code)
{
if (code <= 0x7F) {
buffer[0] = code;
return 1;
}
if (code <= 0x7FF) {
buffer[0] = 0xC0 | (code >> 6); /* 110xxxxx */
buffer[1] = 0x80 | (code & 0x3F); /* 10xxxxxx */
return 2;
}
if (code <= 0xFFFF) {
buffer[0] = 0xE0 | (code >> 12); /* 1110xxxx */
buffer[1] = 0x80 | ((code >> 6) & 0x3F); /* 10xxxxxx */
buffer[2] = 0x80 | (code & 0x3F); /* 10xxxxxx */
return 3;
}
if (code <= 0x10FFFF) {
buffer[0] = 0xF0 | (code >> 18); /* 11110xxx */
buffer[1] = 0x80 | ((code >> 12) & 0x3F); /* 10xxxxxx */
buffer[2] = 0x80 | ((code >> 6) & 0x3F); /* 10xxxxxx */
buffer[3] = 0x80 | (code & 0x3F); /* 10xxxxxx */
return 4;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您为它提供了一个unsigned char数组,四个或更大的字符,以及Unicode代码点.该函数将返回在UTF-8中编码代码点所需的字符数,并在数组中分配.对于上面的代码0x10FFFF,该函数将返回0(未编码),但不会检查Unicode代码点是否有效.IE浏览器.这是一个简单的编码器,以及所有它知道Unicode是代码点来自0于0x10FFFF,包容性.例如,它对代理对没有任何了解.
请注意,因为代码点显式是无符号整数,所以负参数将根据C规则转换为无符号.
您需要编写一个函数,在每个unsigned char中打印出至少8个有效位(C标准允许更大的char大小,但UTF-8仅使用8位chars).然后,使用上述函数来转换一个Unicode代码点(0到0x10FFFF,含)至UTF-8表示,并致电位函数为阵列中的每个无符号字符,在增加的顺序,为无符号字符上述转换函数的计返回该代码点.