繁体   English   中英

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

[英]How Get a Utf-8 Char from String Using C?

旧问题: 如何使用C限制SubString? ,但是没有人没有回答我的问题。

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

我的字符串可能包含符号和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感兴趣。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM