【问题标题】:OSX and C++ unicode conversion from NFD to NFC从 NFD 到 NFC 的 OSX 和 C++ unicode 转换
【发布时间】:2013-04-01 03:26:02
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    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 的路径转换为 ​​precomposeFilename() 的 std::string 参数?
    【解决方案2】:

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

    【讨论】:

    • 但是在那之后我可以取回一个有用的 c 字符串吗?我尝试了几种形式,但都没有达到我的预期
    • 在那个 NSString 上调用 [string dataUsingEncoding:NSUTF16StringEncoding] 应该会给你你想要的,你试过了吗?
    • 我明天试试(我现在感觉不舒服)并提供反馈。谢谢
    • 感谢您的帮助,我发现 CFString 正是我要找的。​​span>
    猜你喜欢
    • 2017-09-08
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多