gpt4 book ai didi

c++ - 从控制台 C++ 读取西里尔文

转载 作者:太空宇宙 更新时间:2023-11-04 15:33:55 25 4
gpt4 key购买 nike

我正在尝试从控制台读取西里尔字母(“Иванчо говори само глупости”),但我得到的所有内容都是“????”。我第一次用 C++ 编写,如果有人帮助我解决这个问题,我将非常感激。

这是我的代码

#include<iostream>
#include<string>
#include<map>
#include<Windows.h>
#include<clocale>

using namespace std;

bool CheckLetters(int letter)
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

bool isCyrillic = ('\u0410' <= letter && letter <= '\u044f');
if ((letter >= 'a' && letter <= 'z')
|| (letter >= 'A' && letter <= 'Z')
|| isCyrillic)
{
return true;
}
return false;
}

int main()
{
string input;
map<unsigned char, int> letters;

getline(cin, input);

for (int i = 0; i < input.size(); i++)
{
unsigned char currentLetter = input[i];
if (CheckLetters(currentLetter))
{
map<unsigned char, int>::iterator elementIter = letters.find(currentLetter);
if (elementIter == letters.end())
{
letters[currentLetter] = 1;
}
else
{
letters[currentLetter] ++;
}
}

}

for (map<unsigned char, int>::iterator current = letters.begin();
current != letters.end(); current++)
{
pair<unsigned char, int> currentElement = *current;
cout << currentElement.first << " " << currentElement.second <<endl;
}

return 0;
}

enter image description here

最佳答案

建议使用 Unicode,而不是将代码页更改为俄语或任何特定语言。 Windows API 使用 UTF16,不幸的是 Windows 控制台对 Unicode 的支持有限。这是一个特定于 Windows 控制台和 Visual Studio 的解决方案(例如,它不适用于 MinGW)。它仍然不适用于某些亚洲语言(或者至少我不知道如何让它工作)

#include <iostream>
#include <string>
#include <io.h> //for _setmode
#include <fcntl.h> //for _O_U16TEXT

int main()
{
_setmode(_fileno(stdout), _O_U16TEXT);
_setmode(_fileno(stdin), _O_U16TEXT);
std::wcout << L"ελληνικά Иванчо English\n";

std::wstring str;
std::wcin >> str;
std::wcout << "output: " << str << "\n";

return 0;
}

请注意,将模式更改为 UTF16 后,您将无法使用 std::cinstd::cout。如果您想继续使用 ANSI 输入/输出,则必须将模式设置回 _O_TEXT。示例:

_setmode(_fileno(stdout), _O_TEXT);
_setmode(_fileno(stdin), _O_TEXT);
std::cout << "Test\n";

收到 UTF16 格式的输入后,您可能需要使用 WideCharToMultiByte(CP_UTF8, ...)转换为 UTF8(存储在 char 中)以兼容网络功能等。

关于c++ - 从控制台 C++ 读取西里尔文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40407830/

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