Преобразование Unicode OSX и C ++ из NFD в NFC

У меня проблема со строками Unicode NFD, полученными из файловой системы OSX.

Это то, что я получаю для «Ä» -Umlaut на OSX «A \ xcc \ x88», и это то, что я ожидаю «\ xc3 \ x84». Та же самая функция делает это прямо под окнами (простая операция повышения файловой системы, вывод каталога).

Пройдя некоторое время поиска, я обнаружил, что Apple кодирует NFD для UTF-8 и остальной мир NFC. Я попытался немного с преобразованием через NSStrings или с boost :: locale :: normalize, но безуспешно.

Кто-нибудь знает способ сделать это в C ++ (я могу использовать Какао через obj-c при необходимости)?

Я хотел бы, чтобы сырая строка Unicode как std :: string (с кодировкой Unicode) после этого.

2

Решение

NSString имеет — (NSString *) функцию precomposedStringWithCanonicalMapping и некоторые другие, похоже, они вам помогут.

2

Другие решения

Это решение получить предварительно составленную форму.

std::string precomposeFilename(const std::string& name)
{
CFStringRef cfStringRef = CFStringCreateWithCString(kCFAllocatorDefault, name.c_str(), kCFStringEncodingUTF8);
CFMutableStringRef cfMutable = CFStringCreateMutableCopy(NULL, 0, cfStringRef);

CFStringNormalize(cfMutable,kCFStringNormalizationFormC);

char c_str[255 + 1];
CFStringGetCString(cfMutable, c_str, sizeof(c_str)-1, kCFStringEncodingUTF8);

CFRelease(cfStringRef);
CFRelease(cfMutable);

return std::string(c_str);
}
2

По вопросам рекламы [email protected]