gpt4 book ai didi

c - 我如何 "decode"一个 UTF-8 字符?

转载 作者:太空宇宙 更新时间:2023-11-04 03:44:55 24 4
gpt4 key购买 nike

假设我想编写一个函数来比较两个 Unicode 字符。我该怎么做?我阅读了一些文章(例如 this ),但仍然没有明白。让我们将 作为输入。它在 0x08000xFFFF 范围内,因此它将使用 3 个字节对其进行编码。我如何解码它?按位操作从wchar_t 中获取3 个字节并存储到3 个char 中? C 中的示例代码可能很棒。

这是我要“解码”的 C 代码,但显然显示错误的值来解码 unicode...

#include <stdio.h>
#include <wchar.h>

void printbin(unsigned n);
int length(wchar_t c);
void print(struct Bytes *b);

// support for UTF8 which encodes up to 4 bytes only
struct Bytes
{
char v1;
char v2;
char v3;
char v4;
};

int main(void)
{
struct Bytes bytes = { 0 };
wchar_t c = '€';
int len = length(c);

//c = 11100010 10000010 10101100
bytes.v1 = (c >> 24) << 4; // get first byte and remove leading "1110"
bytes.v2 = (c >> 16) << 5; // skip over first byte and get 000010 from 10000010
bytes.v3 = (c >> 8) << 5; // skip over first two bytes and 10101100 from 10000010
print(&bytes);

return 0;
}

void print(struct Bytes *b)
{
int v1 = (int) (b->v1);
int v2 = (int)(b->v2);
int v3 = (int)(b->v3);
int v4 = (int)(b->v4);

printf("v1 = %d\n", v1);
printf("v2 = %d\n", v2);
printf("v3 = %d\n", v3);
printf("v4 = %d\n", v4);
}

int length(wchar_t c)
{
if (c >= 0 && c < 0x007F)
return 1;
if (c >= 0x0080 && c <= 0x07FF)
return 2;
if (c >= 0x0800 && c <= 0xFFFF)
return 3;
if (c >= 0x10000 && c <= 0x1FFFFF)
return 4;
if (c >= 0x200000 && c <= 0x3FFFFFF)
return 5;
if (c >= 0x4000000 && c <= 0x7FFFFFFF)
return 6;

return -1;
}

void printbin(unsigned n)
{
if (!n)
return;

printbin(n >> 1);
printf("%c", (n & 1) ? '1' : '0');
}

最佳答案

比较 UTF-8 编码的字符一点也不容易。最好不要尝试。要么:

  1. 将它们都转换为宽格式(32 位整数)并进行算术比较。请参阅 wstring_convert 或您最喜欢的供应商特定函数;或者

  2. 将它们转换为 1 个字符的字符串,并使用比较 UTF-8 编码字符串的函数。在 C++ 中没有执行此操作的标准方法,但它是其他语言(例如 Ruby、PHP 等)中的首选方法。


为了清楚起见,难点在于获取编码为 UTF_8 的原始位/字节/字符并进行比较。这是因为您的比较必须考虑编码才能知道是比较 8 位、16 位还是更多位。如果您能以某种方式将原始数据位转换为以 null 结尾的字符串,那么使用常规字符串函数进行比较就非常容易了。此字符串的长度可能超过一个字节/八位字节,但它将表示单个字符/代码点。


Windows 有点特殊。宽字符是 short int(16 位)。从历史上看,这意味着 UCS-2,但它已被重新定义为 UTF-16。这意味着可以直接比较基本多语言平面 (BMP) 中的所有有效字符,因为它们将占用一个 short int,但其他字符不能。我不知道有什么简单的方法可以在 Windows 上的 BMP 之外处理 32 位宽的字符(表示为一个简单的 int)。

关于c - 我如何 "decode"一个 UTF-8 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25477582/

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