gpt4 book ai didi

c - 如何使用 C 从字符串中获取 UTF-8 字符?

转载 作者:行者123 更新时间:2023-11-30 14:58:02 24 4
gpt4 key购买 nike

老问题:How SubString,Limit Using C? ,但是没有人回答我的问题。

我想从字符串中获取一个索引。

我的字符串可能包含符号和 utf-8 字符。(例如:ß)

弦的速度对我来说很重要。

1#:w_char_t 数据类型适合我吗?

2#:如何从utf-8字符串中获取字符?

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

int main()
{
wchar_t *msg1 = L"ßC Programming";
//wprintf(L" vals> %Ls\n",msg1);
//wprintf(L" vals> %s\n",msg1);
printf(" vals> %Ls %S\n",msg1,msg1);//dont show any=====>BUG
printf(" val> %Lc\n",msg1[1]);//show `C`
printf(" val> %Lc\n",msg1[0]);//dont show any=====>BUG
printf("\n");
/////////////////////////////////
char *msg2 = "ßC Programming";
printf(" vals> %s\n",msg2);//show `ßC Programming`
printf(" val> %c\n",msg2[1]);//show `�`=====>BUG
printf(" val> %c\n",msg2[0]);//show `�`=====>BUG
printf("\n");
}

请指导我解决问题。

最佳答案

wchar_t 可以是一个选项。不过,您应该了解它使用的编码。如果它是 16 位宽,使用 utf-16(常见,但不能保证)并且您使用的代码点等于或高于 0x10000 (U+10000),您会再次遇到同样的问题...

不过,我个人宁愿保留普通字符。

现在的问题是,如何检测多字节字符。您可以通过查看最高有效位来发现这些:如果未设置,则您有一个普通字符(ASCII 兼容...),如果设置,则该字节是多字节字符的一部分。

如果第二个 MSB 也被设置,则它是多字节序列的起始字节,如果未设置,则它是后续字节。

utf-8多字节序列的格式如下:

第一个字节:n 个最高有效位设置为 1 指定整个序列包含多少个字节,后跟一个零位。其余位是 unicode 代码点的最高有效位。

每个后续字节都有 10 个最高有效位,其余 6 位是代码点的下一个最高有效位。

示例字母“ß”:它的 unicode 代码点为 0xdf,二进制为 0b11011111。

需要 8 位,不适合单字节字符的 7 位,因此我们需要将其拆分:

11 + 011111

总共需要两个字节,因此需要添加字节头11010;第一个字节必须用零填充:

110 000 11 + 10 011111

因此您得到字节序列 0b11000011, 0b10011111(十六进制:0xc3, 0x9f)。

不过,有一些库可以促进这一点。您可能对ICU感兴趣,例如。

关于c - 如何使用 C 从字符串中获取 UTF-8 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43514028/

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