我想不出一种方法来删除前导零。我的目标是for
循环创建每个数字的 UTF-8 和 UTF-32 版本。
例如,对于 UTF-8,我不需要删除前导零吗?有谁有解决方案来解决这个问题?基本上我要问的是:有人有一个简单的解决方案将 Unicode 代码点转换为 UTF-8 吗?
for (i = 0x0; i < 0xffff; i++) {
printf("%#x \n", i);
//convert to UTF8
}
所以这是我试图为每个人完成的一个例子i
.
- For example: Unicode value U+0760 (Base 16) would convert to UTF8 as
- 二进制:1101 1101 1010 0000
- 十六进制:DD A0
基本上我正在尝试为每个人做到这一点i
将其转换为 UTF-8 中的十六进制等效值。
我遇到的问题是,将 Unicode 转换为 UTF-8 的过程似乎涉及从位数中删除前导 0。我不太确定如何动态地做到这一点。
正如维基百科UTF-8页描述,每个 Unicode 代码点(0 到 0x10FFFF)都以 UTF-8 字符编码为一到四个字节。
这是一个简单的示例函数,是根据我之前的一篇文章编辑的。我现在已经删除了U
也来自整数常量的后缀。 (..其目的是提醒人类程序员,由于某种原因,常量显式无符号(根本不考虑负代码点),并且它确实假设 unsigned intcode
-- 编译器不在乎,可能是因为这种做法即使对于这里的长期成员来说也显得奇怪和令人困惑,所以我放弃并停止尝试包含这样的提醒。 :( )
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;
}
您为其提供一个无符号字符数组(四个或更大的字符)以及 Unicode 代码点。该函数将返回用 UTF-8 编码代码点所需的字符数,并在数组中分配这些字符。对于上面的代码,该函数将返回 0(未编码)0x10FFFF
,但它不会以其他方式检查 Unicode 代码点是否有效。 IE。它是一个简单的编码器,它所知道的关于 Unicode 的所有信息就是代码点来自0
to 0x10FFFF
, 包括的。例如,它对代理对一无所知。
请注意,由于代码点明确是无符号整数,因此负参数将根据 C 规则转换为无符号。
您需要编写一个函数来打印每个无符号字符中的至少 8 个有效位(C 标准确实允许更大的字符大小,但 UTF-8 仅使用 8 位字符)。然后,使用上面的函数转换 Unicode 代码点(0
to 0x10FFFF
,包含)到 UTF-8 表示形式,并按升序为数组中的每个无符号字符调用位函数,以获得上述转换函数为该代码点返回的无符号字符的计数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)