将utf8转换为utf32

问题描述 投票:0回答:1

我真的无法在网上找到任何帮助!就像我在许多c++23程序中看到的那样,我想做的是:

for(char32_t c : utf8string | utf8to32())

这样我就可以处理每个单独的代码点。最好我想使用 boost::locale 因为我已经做了一个

boost::locale::normalize(in.begin(),in.end(),boost::locale::norm_nfc)

在构造函数中。在网上我看到提到了一些神秘的 boost/text/transcode_iterator.hpp ,它在我的系统上不存在。但即使这样也无法为上述 utf8to32 提供正确的类。关于我在哪里可以找到的任何提示?我该如何去写这样的课程呢?显然我需要在 std::string 的现有迭代器上绕另一个迭代器。然后我需要将新的迭代器放入容器中,以便在 for 循环中将其视为这样?如果我已经找到合适的迭代器实现,有什么例子可以做到这一点吗?

需要明确的是:我想读取 utf8 代码点,将它们与某些给定的代码点进行比较,并可能标记它们的位置以供将来使用。在7位ascii中很容易做到,我该如何在utf8中做到呢?好像还没有大量完全支持 21 位 utf8 的语法解析器...

c++ boost utf c++23
1个回答
0
投票
  1. Boost.Text 是一个提议的库,而不是 Boost 的实际部分。您可以从 Github 下载它,但它现在不会出现在您的包管理器中。
  2. Boost 实际上或多或少有几种你想要的实现,特别是
    boost/regex/pending/unicode_iterator.hpp
    u8_to_u32_iterator
    类,看起来特别接近。
  3. 如果您没有坚定地使用迭代器适配器、范围或其他此类机制,我会推荐 https://github.com/simdutf/simdutf,这是一个为速度而构建的 Unicode 转码库。
  4. 话虽如此,你其实并不需要它。如果您只需要检查输入流中的几个字符,只需将这些字符存储为 UTF-8 字符串,然后与流的子序列进行比较。作为一种优化,您可以跳过无法启动 UTF-8 序列的字符(编写非常简单的检查)。
© www.soinside.com 2019 - 2024. All rights reserved.