西里尔字母问题,搜索字符串

时间:2014-12-20 11:29:36

标签: c

我必须写一些符号。如果我在字符串中查找scount为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;
}

2 个答案:

答案 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;
}