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

OSX and C++ unicode conversion from NFD to NFC

本文关键字:c++ unicode 转换 OSX NFD NFC      更新时间:2023-10-16

我有一个问题与NFD Unicode字符串我从OSX文件系统。

这是我在OSX"Axccx88"上得到的"Ä"-Umlaut,这是我期望的"xc3x84"。同样的函数在windows下也可以这样做(简单的boost文件系统操作,列出一个目录)。

在搜索了一段时间后,我发现苹果的NFD编码为UTF-8和世界其他地方的NFC。我尝试了一些转换通过nsstring或boost::locale::normalize,但没有成功。

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

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

这是获得预组合表单的解决方案。

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

NSString有- (NSString *)precomposedStringWithCanonicalMapping功能,和其他一些,看起来他们会帮助你。