用C ++匹配俄语元音

时间:2013-05-16 14:38:16

标签: c++ cyrillic

我想编写一个函数,如果给定的字符是俄语元音,则返回true。但我得到的结果对我来说很奇怪。这是我到目前为止所得到的:

#include <iostream>

using namespace std;

bool is_vowel_p(char working_char)
// returns true if the character is a russian vowel
{
    string matcher = "аяё×эеуюыи";

    if (find(matcher.begin(), matcher.end(), working_char) != matcher.end())
        return true;
    else
        return false;
}


void main()
{
    cout << is_vowel_p('е') << endl; // russian vowel
    cout << is_vowel_p('Ж') << endl; // russian consonant

    cout << is_vowel_p('D') << endl; // latin letter
}

结果是:

1
1
0

对我来说很奇怪。我期待以下结果:

1
0
0

似乎有某种内部机制我还不知道。我最初对如何修复此功能以使其正常工作感兴趣。第二,那里发生了什么,我得到了这个结果。

4 个答案:

答案 0 :(得分:8)

stringchar仅保证代表基本字符集中的字符 - 不包括西里尔字母。

使用wstringwchar_t,并在字符串和字符文字之前添加L以表明它们使用宽字符,应该允许您使用这些字母。

另外,为了便于携带,您需要为<algorithm>添加find,并为main提供int的返回类型。

答案 1 :(得分:3)

C ++源代码是ASCII。您正在输入unicode字符。使用8位值进行比较。我打赌其中一个元音符合以下要求: -

vowel & 255 == (code point for 'Ж') & 255

您需要使用unicode函数来执行此操作,而不是使用ASCII函数,即使用需要wchar_t值的函数。另外,请确保您的编译器可以解析非ASCII元音字符串。使用MS VC,编译器需要: -

L"аяё×эеуюыи" or TEXT("аяё×эеуюыи")

后者是一个在使用unicode支持进行编译时添加L的宏。

将代码转换为使用wchar_t,它应该可以工作。

答案 2 :(得分:2)

locale.h中非常有用的功能

setlocale(LC_ALL, "Russian");

在程序开始时过去这个。 例如:

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

void main()
{
    setlocale(LC_ALL, "Russian");

    printf("Здравствуй, мир!\n");//Hello, world!
}

答案 3 :(得分:1)

确保您的系统默认语言环境是俄语,并确保您的文件保存为代码页1251(西里尔语/ Windows)。如果它保存为Unicode,则无法使用。

系统默认语言环境是非Unicode兼容程序使用的语言环境。它位于“控制面板”中的“区域设置”下。

或者,重写以使用wstringwchar_t以及L""字符串/字符文字。