7

どのオープンソースCまたはC++ライブラリが任意のUTF-32をNFCに変換できますか?

これまでのところ、これを実行できると思うライブラリ:ICU、Qt、GLib(わかりませんか?)。

他の複雑なUnicodeサポートは必要ありません。任意であるが既知の正しいUTF-32からNFC形式のUTF-32に変換するだけです。

私はこれを直接行うことができるライブラリに最も興味があります。たとえば、QtとICU(私が知る限り)はどちらも、UTF-16との間の中間変換ステージを介してすべてを実行します。

4

2 に答える 2

2

ICUまたはBoost.Locale(ICUのラッピング)は、非常に長い道のりで最善になります。正規化マッピングは、より多くのソフトウェアからのマッピングと同等になります。これがこの変換のポイントであると思います。

于 2011-12-01T04:53:08.937 に答える
0

これが、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;
}
于 2013-02-03T01:37:41.820 に答える