2013-04-09 3 views
2

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

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

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

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

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

ответ

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); 
} 
+0

Как вы преобразовываете путь на основе NSString к параметру std :: string для precomposeFilename()? – radj

2

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

+0

Но могу ли я вернуть полезную строку c после этого? Я пробовал несколько форм, но ничего не было близко к тому, что я ожидал – plucked

+1

Вызов [string dataUsingEncoding: NSUTF16StringEncoding] на том, что NSString должен дать вам то, что вы хотите, вы попробовали? –

+0

Я дам ему попробовать завтра (сейчас я чувствую себя болен) и даю обратную связь. Спасибо – plucked