2

我从 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 编码)。

4

2 回答 2

3

这是获得预组合形式的解决方案。

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);
}
于 2013-04-11T11:31:43.343 回答
2

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

于 2013-04-09T16:02:38.810 回答