如何将 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++?

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

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

á

假设我有代码:

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

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

我意识到有一些 codecvt 方面,但我不确定如何使用它以及它是否是最好的方法,我使用 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++),我仍然有 UTF-8 中的 á 和 UTF-16 中的 á

L"á" 表示文件是用错误的编码读取的。在阅读流之前,您必须 imbue 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