哪些开源 C 或 C++ 库可以将任意 UTF-32 转换为 NFC? [关闭]

Posted

技术标签:

【中文标题】哪些开源 C 或 C++ 库可以将任意 UTF-32 转换为 NFC? [关闭]【英文标题】:What open source C or C++ libraries can convert arbitrary UTF-32 to NFC? [closed] 【发布时间】:2012-01-05 09:14:36 【问题描述】:

哪些开源 C 或 C++ 库可以将任意 UTF-32 转换为 NFC?

目前我认为可以做到这一点的库:ICU、Qt、GLib(不确定?)。

我不需要任何其他复杂的 Unicode 支持;只是从任意但已知正确的 UTF-32 转换为 NFC 形式的 UTF-32。

我对可以直接执行此操作的库最感兴趣。例如,Qt 和 ICU(据我所知)都通过与 UTF-16 之间的中间转换阶段完成所有工作。

【问题讨论】:

什么是 NFC? Unicode 规范化形式规范组合? @BillyONEal:我很确定就是这样。见en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms 为什么要关心实现细节?我不在乎图书馆是否在内部使用 UTF-13,只要它能产生正确的结果。 “我不需要复杂的 Unicode 支持”是一个奇怪的要求。当然,规范化一个非常复杂的操作,需要完全访问 Unicode 字符数据库... @MSalters 你说得对,实施在很大程度上并不重要。但是,我使用 C++ 是因为我关心内存使用和执行时间:单个中间转换可以轻松地将两者翻倍。如果我完全不关心,我会使用 python 并完成它。 =) 【参考方案1】:

这是我在决定 ICU 后最终使用的代码的主要部分。我想我应该把它放在这里,以防它帮助尝试同样事情的人。

std::string normalize(const std::string &unnormalized_utf8) 
    // FIXME: until ICU supports doing normalization over a UText
    // interface directly on our UTF-8, we'll use the insanely less
    // efficient approach of converting to UTF-16, normalizing, and
    // converting back to UTF-8.

    // Convert to UTF-16 string
    auto unnormalized_utf16 = icu::UnicodeString::fromUTF8(unnormalized_utf8);

    // Get a pointer to the global NFC normalizer
    UErrorCode icu_error = U_ZERO_ERROR;
    const auto *normalizer = icu::Normalizer2::getInstance(nullptr, "nfc", UNORM2_COMPOSE, icu_error);
    assert(U_SUCCESS(icu_error));

    // Normalize our string
    icu::UnicodeString normalized_utf16;
    normalizer->normalize(unnormalized_utf16, normalized_utf16, icu_error);
    assert(U_SUCCESS(icu_error));

    // Convert back to UTF-8
    std::string normalized_utf8;
    normalized_utf16.toUTF8String(normalized_utf8);

    return normalized_utf8;

【讨论】:

【参考方案2】:

ICU 或 Boost.Locale(包裹 ICU)将在很长很长一段时间内成为您最好的。规范化映射将与来自更多软件的映射等效,我认为这是此转换的重点。

【讨论】:

只有一种可能的(正确的)NFC 规范化映射,因此不存在任何兼容性问题,但我认为 ICU 可能是最不可能出现故障的。我希望有一些重量更轻的东西可以进行标准化,但经过大量研究后,我最终决定 ICU 也是最佳选择,所以我将其标记为已接受。 =) 澄清一下,兼容性我的意思是一如既往:'双方可能有相同的错误'=)

以上是关于哪些开源 C 或 C++ 库可以将任意 UTF-32 转换为 NFC? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

thrift c++ windows 依赖哪些库

c++标准库都有哪些?

如何系统地学习 C/C++ 语言有哪些C++开源项目可以学习呢?

是否有简单的 C 或 C++ API 来修改 selinux 上下文?

c++ 标准库函数都有哪些?

用于操作图像的 C++ 库