fstream 无法正常处理俄语文本?

fstream not working properly with russian text?

我经常使用俄语,我一直在尝试从具有输入流的文件中获取数据。这是代码,它应该只输出不超过 5 个字符的单词。

#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
using namespace std;
int main()
{
    setlocale(LC_ALL, "ru_ru.utf8");
    ifstream input{ "in_text.txt" };
    if (!input) {
        cerr << "Ошибка при открытии файла" << endl;
        return 1;
    }
    cout << "Вывод содержимого файла: " << "\n\n";
    string line{};
    while (input >> line) {
        if (line.size() <= 5)
            cout << line << endl;
    }
    cout << endl;

    input.close();
    return 0;
}

这是问题所在:

我注意到输出没有提取实际包含少于 5 个字符的所有单词。所以我用英文单词“Test”和俄语翻译“тест”做了一个简单的测试,字符数相同。所以我的文本文件看起来像这样:

Test тест

我曾经调试程序以查看程序如何 运行 并且它打印出英文单词并留下俄语。我不明白为什么会这样。

P.S。当我将代码更改为 if (line.size() <= 8) 时,它会打印出它们。很奇怪

我想我不知何故弄乱了我的系统语言环境。我试过一次 std::locale 没有真正理解它,也许这对我的电脑做了什么我不太确定。请帮助

我对此非常不确定,但使用 codecvt_utf8 and wstring_convert 似乎可行:

#include <codecvt>   // codecvt_utf8
#include <string>
#include <iostream>
#include <locale>    // std::wstring_convert

int main() {
    // ...

    while (input >> line) {
        // convert the utf8 encoded `line` to utf32 encoding:
        std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> u8_to_u32;
        std::u32string u32s = u8_to_u32.from_bytes(line);

        if (u32s.size() <= 5)           // check the utf32 length
            std::cout << line << '\n';  // but print the utf8 encoded string
    }

    // ...
}

Demo