当前位置:  开发笔记 > 编程语言 > 正文

在Mac OS X下等效的_wfopen

如何解决《在MacOSX下等效的_wfopen》经验,为你挑选了2个好方法。

我期待_wfopen()在Mac OS X下相当于Windows .任何想法?

我需要这个以便移植wchar*用于其File接口的Windows库.由于这是一个跨平台的库,我无法依赖客户端应用程序如何获取文件路径并将其提供给库.



1> Vincent Robe..:

Mac OS X中的POSIX API可用于UTF-8字符串.为了将wchar_t字符串转换为UTF-8,可以使用Mac OS X中的CoreFoundation框架.

这是一个将从wchar_t字符串中包装UTF-8生成的字符串的类.

class Utf8
{
public:
    Utf8(const wchar_t* wsz): m_utf8(NULL)
    {
        // OS X uses 32-bit wchar
        const int bytes = wcslen(wsz) * sizeof(wchar_t);
        // comp_bLittleEndian is in the lib I use in order to detect PowerPC/Intel
        CFStringEncoding encoding = comp_bLittleEndian ? kCFStringEncodingUTF32LE
                                                       : kCFStringEncodingUTF32BE;
        CFStringRef str = CFStringCreateWithBytesNoCopy(NULL, 
                                                       (const UInt8*)wsz, bytes, 
                                                        encoding, false, 
                                                        kCFAllocatorNull
                                                        );

        const int bytesUtf8 = CFStringGetMaximumSizeOfFileSystemRepresentation(str);
        m_utf8 = new char[bytesUtf8];
        CFStringGetFileSystemRepresentation(str, m_utf8, bytesUtf8);
        CFRelease(str);
    }   

    ~Utf8() 
    { 
        if( m_utf8 )
        {
            delete[] m_utf8;
        }
    }

public:
    operator const char*() const { return m_utf8; }

private:
    char* m_utf8;
};

用法:

const wchar_t wsz = L"Here is some Unicode content: éà€œæ";
const Utf8 utf8 = wsz;
FILE* file = fopen(utf8, "r");

这将用于读取或写入文件.



2> Chris Hanson..:

您只想使用可能包含Unicode字符的路径打开文件句柄,对吗?只需将文件系统表示中的路径传递给fopen.

如果路径来自库存Mac OS X框架(例如,Open面板,无论是Carbon还是Cocoa),您将不需要对其进行任何转换,并且可以按原样使用它.

如果您自己生成部分路径,则应该从路径创建CFStringRef,然后在文件系统表示中将其传递给POSIX API,如openfopen.

一般来说,对于大多数应用程序,您不必执行大量操作.例如,许多应用程序可能将辅助数据文件存储在用户的Application Support目录中,但只要这些文件的名称是ASCII,并且您使用标准的Mac OS X API来查找用户的Application Support目录,就不需要了做一堆用这两个组件构造的路径的偏执转换.

编辑添加: 我强烈建议不要使用类似的东西将所有内容转换为UTF-8,wcstombs因为文件系统编码不一定与生成的UTF-8相同.Mac OS X和Windows都对文件系统路径中使用的编码使用特定(但不同)的规范分解规则.

例如,它们需要决定"é"是否将被存储为一个或两个编码单元(或者LATIN SMALL LETTER E WITH ACUTELATIN SMALL LETTER E随后COMBINING ACUTE ACCENT).这将导致两个不同的 - 不同长度 - 字节序列,并且Mac OS X和Windows都可以避免在同一目录中放置具有相同名称(用户感知它们)的多个文件.

如何执行这种规范分解的规则可能非常繁琐,因此,不要试图自己实现它,最好将它留给系统框架为您提供的功能.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有