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
}
// ...
}
我经常使用俄语,我一直在尝试从具有输入流的文件中获取数据。这是代码,它应该只输出不超过 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
}
// ...
}