我必须写一些符号。如果我在字符串中查找s
,count
为3,但如果我正在寻找西里尔字母(н
),那就错了。我试图寻找237
代码。我在ASCII表http://ascii.org.ru/ascii.pdf中找到了这段代码。
我该如何解决?
#include <stdio.h>
#include <string.h>
int main () {
char str[] = "This is a string. нннн";
char * pch;
int count = 0;
pch = strchr(str, 's');
while (pch != NULL) {
count++;
pch = strchr(pch + 1, 's');
}
printf("%i", count);
return 0;
}
答案 0 :(得分:4)
您必须使用西里尔语编码保存C文件。
如果使用Unicode保存文件,例如UTF-8 н
将是一个双字节字形。
0x04 0x3d (4 61)
不
0xed (237)
实际上,编译器在解析源文件并遇到以下行时读取的内容:
pch = strchr(str, 'н');
是
pch = strchr(str, 0x0461);
不
pch = strchr(str, 0xed);
根据编辑器的不同,您通常可以更改文件的编码,例如在Vim
set fenc=cyrillic
set fenc=iso-8859-5
etc.
然后
pch = strchr(pch + 1, 'н');
应该按预期工作。否则你可以搜索237的字节值,但是,文件必须是西里尔字母,所有相同的,因为你的输入字符串将具有与源文件相同的编码。
除此之外;调查wchar_t
可能是最好的方法。但话又说回来,都取决于具体情况。
答案 1 :(得分:4)
我建议切换到wchar_t
和宽字符函数(wcschr()
等)。
因此程序中的字符数据将存储在32位(Linux)或16位(Windows)而不是8位。这样可以正确处理所有语言环境。
此外,如果您需要使用UTF-8(多字节字符串),mbstowcs()
应将数据转换为wchar_t
。
完整示例:
#include <stdio.h>
#include <wchar.h>
int main () {
wchar_t str[] = L"This is a string. нннн";
wchar_t * pch;
int count = 0;
pch = wcschr(str, L'н');
while (pch != NULL) {
count++;
pch = wcschr(pch + 1, L'н');
}
wprintf(L"%i", count);
return 0;
}