如何将 UTF-8 文本从文件转换为某个可以迭代的容器,并检查每个符号是否为C++字母数字?

How to convert UTF-8 text from file to some container which can be iterable and check every symbol for being alphanumeric in C++?

本文关键字:检查 符号 数字 是否 C++ 迭代 文本 UTF-8 文件 转换      更新时间:2023-10-16

我阅读了大约 20 个问题并检查了有关它的文档,但没有成功,我没有任何编写处理这些东西的代码的经验,我总是避免它。

假设我有一个文件,我相信它总是 UTF-8:

á

假设我有代码:

wifstream input{argv[1]};
wstring line;
getline(input, line);

当我调试它时,我看到它存储为L"á",所以基本上它不是我想要的可迭代的,我希望只有 1 个符号能够调用比方说iswalnum(line[0]).

我意识到有一些编解码器方面,但我不确定如何使用它以及它是否是最佳方法,我使用 VS2019 中的 cl.exe,这给了我很多转换和弃用错误提供的示例: https://en.cppreference.com/w/cpp/locale/codecvt_utf8

我意识到有一个from_bytes函数,但我使用了VS2019中的cl.exe,这也在提供的示例中给我带来了很多错误: https://en.cppreference.com/w/cpp/locale/wstring_convert/from_bytes

那么如何正确阅读该行,假设该字母(符号(á并能够将其迭代为大小为 1 的某个容器,以便可以简单地调用像iswalnum这样的函数?

编辑:当我修复这些示例中的错误(对于c ++latest(时,我仍然áUTF-8和UTF-16á

L"á"表示文件被错误编码读取。在读取流之前,您必须灌输 UTF-8 语言环境。

wifstream input{argv[1]};
input.imbue(std::locale("en_US.UTF-8"));
wstring line;
getline(input, line);

现在wstring line将包含 Unicode 代码点(在您的案例中á(,并且可以轻松迭代。


警告:在Windows上,wchar_t是有缺陷的(16位(,并且足以仅迭代BMP。