Читать текстовый файл в 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
работает,
В двух словах, более интересная часть для вас:
std::stream
(stringstream
,fstream
,cin
,cout
) имеет внутренний объект locale, который соответствует значению глобальной локали C++ в момент создания объекта потока. Какstd::in
создается задолго до того, как ваш код вmain
называется, он, скорее всего, имеет классический язык C, независимо от того, что вы делаете потом.- Вы можете убедиться, что
std::stream
объект имеет желаемую локаль, вызываяstd::stream::imbue(std::locale(your_favorit_locale))
,
Я хотел бы добавить следующее:
Почти никогда не бывает хорошей идеей установить глобальный языковой стандарт - он может сломать другие части программы или библиотеки третьих частей - вы никогда не узнаете.
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");
Если использование ответа Владислава не решает эту проблему, взгляните на ответ на stl - Сбой декодирования Shift-JIS с помощью wifstrem в Visual C++ 2013 - Переполнение стека:
const int oldMbcp = _getmbcp();
_setmbcp(936);
const std::locale locale("Chinese_China.936");
_setmbcp(oldMbcp);
Кажется, есть ошибка в реализации локалей Visual Studio. См. Также C++ - проблема преобразования двухбайтовых последовательностей символов в Visual Studio 2015 - переполнение стека.