从NFD到NFC的OSX和C ++ unicode转换

时间:2013-04-09 15:39:25

标签: c++ unicode utf-8 normalization unicode-normalization

我遇到了从OSX文件系统获得的NFD Unicode字符串的问题。

这就是我在OSX“A \ xcc \ x88”上获得的“Ä”-Umlaut,这就是我所期望的“\ xc3 \ x84”。 Windows下的功能相同(简单的boost文件系统操作,列出目录)。

经过一段时间的搜索,我发现Apple的NFD编码为UTF-8和世界其他地区的NFC。我尝试过使用NSStrings或使用boost :: locale :: normalize进行转换,但没有成功。

有没有人知道在C ++中这样做的方法(如果需要,我可以通过obj-c使用Cocoa)?

之后我希望原始的unicode字符串为std :: string(带有unicode编码)。

2 个答案:

答案 0 :(得分:2)

NSString有 - (NSString *)precomposedStringWithCanonicalMapping函数,以及其他一些函数,看起来他们会帮助你。

答案 1 :(得分: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);
}