У меня проблема со строками 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) после этого.
NSString имеет — (NSString *) функцию precomposedStringWithCanonicalMapping и некоторые другие, похоже, они вам помогут.
Это решение получить предварительно составленную форму.
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);
}