Какие библиотеки с открытым исходным кодом C или C++ могут конвертировать произвольные UTF-32 в NFC?

Какие библиотеки с открытым исходным кодом C или C++ могут конвертировать произвольные UTF-32 в NFC?

Библиотеки, которые, я думаю, могут сделать это до сих пор: ICU, Qt, GLib (не уверены?).

Мне не нужна никакая другая сложная поддержка Юникода; просто преобразование из произвольного, но известного правильного UTF-32 в UTF-32 в форме NFC.

Меня больше всего интересует библиотека, которая может сделать это напрямую. Например, Qt и ICU (насколько я могу судить) оба делают все через промежуточную стадию преобразования в и из UTF-16.

2 ответа

Решение

ICU или Boost.Locale (упаковка ICU) будут вашими лучшими очень-очень долгим способом. Отображения нормализации будут эквивалентны сопоставлениям из большего количества программного обеспечения, что, как я полагаю, является точкой этого преобразования.

Вот основная часть кода, который я использовал после выбора 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;
}
Другие вопросы по тегам