2013-04-09 3 views
2

OSX 파일 시스템에서 얻은 NFD 유니 코드 문자열에 문제가 있습니다.NFD에서 NFC 로의 OSX 및 C++ 유니 코드 변환

이것은 "OS X"A \ xcc \ x88 "에서"Ä "-Umlaut를 얻는 것으로,"\ xc3 \ x84 "를 기대합니다. 같은 기능이 윈도우 바로 아래에 있습니다 (간단한 부스트 파일 시스템 작업, 디렉토리 나열).

잠시 검색 한 결과, Apple이 NFD가 UTF-8 및 나머지 NFC를 코딩하고 있음을 알았습니다. NSStrings 또는 boost :: locale :: normalize를 통해 변환을 시도했지만 성공하지 못했습니다.

누구든지 C++에서이 작업을 수행하는 방법을 알고 있습니까? (필요한 경우 obj-c를 통해 코코아를 사용할 수 있습니까?)

원시 유니 코드 문자열을 std :: string (유니 코드 코딩 사용)으로 사용하고 싶습니다.

답변

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 기반 경로를 precomposeFilename()에 대한 std :: string 매개 변수로 어떻게 변환합니까? – radj

2

NSString은 - (NSString *) precomposedStringWithCanonicalMapping 함수와 다른 것들은 도움이 될 것 같습니다.

+0

그 후에 유용한 C 문자열을 다시 가져올 수 있습니까? 몇 가지 양식을 시도했지만 아무것도 기대했던 것과 비슷했습니다. – plucked

+1

NSString에서 [string dataUsingEncoding : NSUTF16StringEncoding]을 호출하면 원하는 것을 제공해야합니까? 시도해 보셨습니까? –

+0

나는 내일 (나는 지금 아프다고 느끼고있다) 시험해보고 피드백을 줄 것이다. 감사합니다 – plucked