2011-11-24 2 views
7

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

私は今までこれを行うことができると思う図書館:ICU、Qt、GLib(わからない?)

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

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

+0

NFCとは? Unicode正規化フォーム正準合成? –

+1

@BillyONeal:そうだとはっきりしています。 http://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms – wallyk

+1

なぜ実装の詳細について気にしますか?適切な結果が得られる限り、ライブラリが内部的にUTF-13を使用するかどうかは気にしません。 – MSalters

答えて

2

ICUまたはBoost.Locale(ラッピングICU)は非常に、非常に長い方法であなたのベストです。正規化のマッピングは、より多くのソフトウェアのものと同等です。私はこの変換のポイントを想定しています。

+0

可能な(正しい)NFC正規化マッピングが1つしかないので、互換性の心配はありませんが、おそらくICUはバグの可能性が最も低いと思われます。私はちょうど正常化を行うことができる少し軽いものを望んでいましたが、多くの見通しの後に私はICUが最善の選択であったと判断したので、これを受け入れたとマークしています。 =) – wjl

+0

明確にするために、互換性によって私はいつものように:両サイドは同じバグを持つ可能性が高い= – rvalue

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; 
} 
関連する問題