哪些开源C或C ++库可以将任意UTF-32转换为NFC?
我认为目前可以做到的图书馆:ICU,Qt,GLib(不确定?)。
我不需要任何其他复杂的Unicode支持;只需从NFC形式的任意但已知正确的UTF-32转换为UTF-32。
我最感兴趣的是一个可以直接执行此操作的库。例如,Qt和ICU(据我所知)都通过与UTF-16之间的中间转换阶段完成所有工作。
答案 0 :(得分:2)
ICU或Boost.Locale(包裹ICU)将是您最好的方式。规范化映射与来自更多软件的映射相同,我认为这是转换的重点。
答案 1 :(得分: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;
}