gpt4 book ai didi

c++ - 使用 boost 和标准 C++ 的 Unicode 安全查找

转载 作者:搜寻专家 更新时间:2023-10-31 02:20:19 24 4
gpt4 key购买 nike

考虑以下片段:

namespace bl = boost::locale;
static bl::generator gen;
static auto loc = gen("en_US.UTF-8");
std::string foo8 = u8"Föo";
std::string deco = bl::normalize(foo8,bl::norm_nfd,loc);
std::string comp = bl::normalize(foo8,bl::norm_nfc,loc);
std::cout << "decomposed: " << deco.find("o") << ", composed: " << comp.find("o") <<"\n";

这给出:“分解:1,组合:3”。

现在,正确答案取决于整理因子,但在大多数情况下,后者将是我想要的——o 的第一个位置,而不是分解的 ö 的第一部分。显然,对于这个示例,我可以将字符串规范化为 NFC 以确保获得所需的结果,但这不适用于无法组成字素簇的情况。

此外,X.find("ö") 将具有实现定义的行为,因为无法保证 ö 在搜索中的编码方式。

我可以通过在 UAX 29 中实现算法或通过规范化搜索字符串来实现 Unicode 安全查找功能,但我想知道是否有一种方法可以通过使用 C++ std 库和 boost 来实现——也许通过将语言环境与字符串算法相结合——但我还没有找到解决方案。

谁有明确的答案?我知道我可以使用 ICU,并且 boost::locale 是 ICU 库的 c++ 友好包装器(至少如果你想要完整的 unicode 支持的话)。

最佳答案

Further, X.find("ö") will have implementation defined behavior, as there are no guarentees how that ö is encoded in the search.

遗憾的是,您对此无能为力。作为 API 的客户端,您必须确保始终使用 u8 前缀调用它并且参数也已规范化。可以编写一个 find 函数在搜索之前对输入进行规范化,但是没有办法减轻编码中的歧义。

I can implement a Unicode safe find function by implementing the algorithm in UAX 29

不需要实现它,因为它已经由 Boost.Locales segment_index 实现了。

I'm wondering if there is a way to do this by using the C++ std library and boost -- perhaps by combining a locale with a string algorithm -- but I haven't found a solution.

标准库对此毫无用处,据我所知,Boost.Locale 没有字符串搜索功能。 ICU 的字符串搜索功能使用规范等价的概念,这可能是您最好的选择。

关于c++ - 使用 boost 和标准 C++ 的 Unicode 安全查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32866458/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com