Читать текстовый файл в C++ (китайский)

Я пытаюсь разработать функцию, которая проверяет, находится ли китайское слово, которое вводит пользователь, в текстовом файле или нет. Ниже приведен код. Но это не работает. Я хочу знать, в чем проблема. Помоги мне, пожалуйста.

setlocale(LC_ALL, "Chinese-simplified");
locale::global(locale("Chinese_China"));
SetConsoleOutputCP(936);
SetConsoleCP(936);

bool exist = FALSE;

cout << "\n\n <Find the keyword whether it is in that image or not> \n ";
cout << "Enter word to search for: ";
wstring search;
wcin >> search; //There is a problem to enter chinese.

wfstream file_text("./a.txt");
wstring line;
wstring::size_type pos;

while (getline(file_text, line))
{
    pos = line.find(search);
    if (pos != wstring::npos) // string::npos is returned if string is not found
    {
        cout << "Found!" << endl;
        exist = true;
        break;
    }
}

Когда я использую этот код, результат будет следующим.

const int oldMbcp = _getmbcp();
_setmbcp(936);
const std::locale locale("Chinese_China.936");
_setmbcp(oldMbcp);

введите описание изображения здесь

3 ответа

Решение

Пытаться locale::global(locale("Chinese_China.936")); или же locale::global(locale(""));И для LC_ALL "chinese-simplified" или же "chs"

Если вы заинтересованы в более подробной информации, пожалуйста, посмотрите Stod-Is-Not-Work-правильно-с-Booloclocale для более подробного описания того, как locale работает,

В двух словах, более интересная часть для вас:

  1. std::stream (stringstream, fstream, cin, cout) имеет внутренний объект locale, который соответствует значению глобальной локали C++ в момент создания объекта потока. Как std::in создается задолго до того, как ваш код в main называется, он, скорее всего, имеет классический язык C, независимо от того, что вы делаете потом.
  2. Вы можете убедиться, что std::stream объект имеет желаемую локаль, вызывая std::stream::imbue(std::locale(your_favorit_locale)),

Я хотел бы добавить следующее:

  1. Почти никогда не бывает хорошей идеей установить глобальный языковой стандарт - он может сломать другие части программы или библиотеки третьих частей - вы никогда не узнаете.

  2. std::setlocale а также locale::global делать немного разные вещи, но locale::global сбрасывает не только глобальную локализацию C++, но и локаль c (которая также устанавливается std::setlocale(не путать с классической локалью "C"), поэтому вы должны вызывать ее в другом порядке, если хотите, чтобы локаль C++ была установлена ​​в Chinese_China и C локаль для chinese-simplified

Первый locale::global(locale("Chinese_China"));

И тогда setlocale(LC_ALL, "Chinese-simplified");

Другие вопросы по тегам