将Unicode代码点转换为UTF-8和UTF-32

Joe*_*cio 2 c utf-8 utf

我想不出一种方法来删除前导零.我的目标是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.

  • 例如:Unicode值U + 0760(Base 16)将转换为UTF8 as
    • 二进制:1101 1101 1010 0000
    • 十六进制:DD A0

基本上我试图这样做,每个i都将它转换为UTF-8中的十六进制等效.

我遇到的问题似乎是将Unicode转换为UTF-8的过程涉及从位数中删除前导0.我不确定如何动态地做到这一点.

Nom*_*mal 6

如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是代码点来自00x10FFFF,包容性.例如,它对代理对没有任何了解.

请注意,因为代码点显式是无符号整数,所以负参数将根据C规则转换为无符号.

您需要编写一个函数,在每个unsigned char中打印出至少8个有效位(C标准允许更大的char大小,但UTF-8仅使用8位chars).然后,使用上述函数来转换一个Unicode代码点(00x10FFFF,含)至UTF-8表示,并致电位函数为阵列中的每个无符号字符,在增加的顺序,为无符号字符上述转换函数的计返回该代码点.