_wfopen equivalent under Mac OS X

后端 未结 5 1384
甜味超标
甜味超标 2021-02-07 06:30

I\'m looking to the equivalent of Windows _wfopen() under Mac OS X. Any idea?

I need this in order to port a Windows library that uses wchar* for its File i

5条回答
  •  刺人心
    刺人心 (楼主)
    2021-02-07 06:30

    POSIX API in Mac OS X are usable with UTF-8 strings. In order to convert a wchar_t string to UTF-8, it is possible to use the CoreFoundation framework from Mac OS X.

    Here is a class that will wrap an UTF-8 generated string from a wchar_t string.

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

    Usage:

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

    This will work for reading or writing files.

提交回复
热议问题