gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:04:04 27 4
gpt4 key购买 nike

我想不出去除前导零的方法。我的目标是在 for 循环中创建每个数字的 UTF-8 和 UTF-32 版本。

例如,使用 UTF-8 不需要删除前导零吗?有没有人有解决方案来解决这个问题?基本上我要问的是:有人有一个简单的解决方案来将 Unicode 代码点转换为 UTF-8?

    for (i = 0x0; i < 0xffff; i++) {
printf("%#x \n", i);
//convert to UTF8
}

所以这里是我试图为每个 i 完成的示例。
  • 例如:Unicode 值 U+0760 (Base 16) 将转换为 UTF8 作为
  • 二进制:1101 1101 1010 0000
  • 十六进制:DD A0

  • 基本上,我试图为每个 i 做到这一点,将其转换为 UTF-8 中的十六进制等效值。

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

    最佳答案

    正如维基百科 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;
    }

    您为其提供一个无符号字符数组、四个字符或更大的字符以及 Unicode 代码点。该函数将返回用 UTF-8 编码代码点所需的字符数,并在数组中分配。对于 0x10FFFF 之上的代码,该函数将返回 0(未编码),但它不会以其他方式检查 Unicode 代码点是否有效。 IE。它是一个简单的编码器,它所知道的关于 Unicode 的全部内容是代码点从 00x10FFFF ,包括在内。例如,它对代理对一无所知。

    请注意,因为代码点明确是一个无符号整数,负参数将根据 C 规则转换为无符号。

    您需要编写一个函数,打印出每个 unsigned char 中最少 8 个有效位(C 标准确实允许更大的字符大小,但 UTF-8 仅使用 8 位字符)。然后,使用上面的函数将 Unicode 代码点( 00x10FFFF ,包括)转换为 UTF-8 表示,并为数组中的每个 unsigned char 调用您的 bit 函数,按递增顺序,对于 unsigned char 的计数上述为该代码点返回的转换函数。

    关于将 Unicode 代码点转换为 UTF-8 和 UTF-32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42012563/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com