gpt4 book ai didi

c - 如何比较C中的多字节字符

转载 作者:太空狗 更新时间:2023-10-29 17:04:19 27 4
gpt4 key购买 nike

我尝试解析文本并在其中找到一些字符。我使用下面的代码。它适用于 abcdef 等普通字符,但不适用于 öçşğüı。 GCC 给出编译警告。我应该怎么做才能使用 öçşğüı

代码:

#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main()
{
char * text = "öçşğü";
int i=0;

text = strdup(text);

while (text[i])
{
if(text[i] == 'ö')
{
printf("ö \n");
}

i++;
}

return 0;
}

警告:

warning: multi-character character constant [-Wmultichar]
warning: comparison is always false due to limited range of data type [-Wtype-limits]

while循环打印char的地址时有10个地址

printf("%d : %p \n", i, text[i]);

输出:

0 : 0xffffffc3 
1 : 0xffffffb6
2 : 0xffffffc3
3 : 0xffffffa7
4 : 0xffffffc5
5 : 0xffffff9f
6 : 0xffffffc4
7 : 0xffffff9f
8 : 0xffffffc3
9 : 0xffffffbc

strlen 为 10。

但是如果我使用abcde:

0 : 0x61 
1 : 0x62
2 : 0x63
3 : 0x64
4 : 0x65

strlen 为 5。


如果我使用 wchar_t 进行文本输出是

0 : 0xa7c3b6c3 
1 : 0x9fc49fc5
2 : 0xbcc3

strlen为10,wcslen为3。

最佳答案

要遍历字符串中的每个字符,可以使用 mblen。您还需要设置正确的语言环境(多字节字符串表示的编码),以便mblen能够正确解析多字节字符串。

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

int main()
{
char * text = "öçşğü";
int i=0, char_len;

setlocale(LC_CTYPE, "en_US.utf8");

while ((char_len = mblen(&text[i], MB_CUR_MAX)) > 0)
{
/* &text[i] contains multibyte character of length char_len */
if(memcmp(&text[i], "ö", char_len) == 0)
{
printf("ö \n");
}

i += char_len;
}

return 0;
}

有两种类型的字符串表示,使用多字节(8 位字节)或宽字节(大小取决于平台)。多字节表示的优点是可以使用 char *(代码中的常用 c 字符串)表示,但缺点是多个字节表示一个字符。宽字符串使用 wchar_t * 表示。 wchar_t 的优点是一个 wchar_t 是一个字符(但是正如@anatolyg 指出的那样,在 wchar_t 无法表示所有可能字符的平台上,这一假设仍然可能出错)。

您是否使用十六进制编辑器查看过您的源代码?字符串 "öçşğü" 实际上在内存中由多字节字符串 c3 b6 c3 a7 c5 9f c4 9f c3 bc 表示(UTF-8 编码),当然是零终止.您看到 5 个字符只是因为该字符串已被支持 UTF-8 的查看器/浏览器正确呈现。很容易意识到 strlen(text) 为此返回 10,而上面的代码只循环了 5 次。

如果您使用宽字节字符串,可以按照@WillBriggs 的说明完成。

关于c - 如何比较C中的多字节字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33737803/

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