我找到等同的窗户 _wfopen() Mac OS X.任何想法?

我需要这个了口Windows库使用 wchar* 对于其文件的接口。因为这是一个交叉平台图书馆的,我无法依赖于如何将客户应用程序将得到文件的道路,并把它交给图书馆。

有帮助吗?

解决方案

POSIX API in Mac OS X使用UTF-8串。为了转换wchar_t string to UTF-8,这是可能的使用CoreFoundation框架,从Mac OS X.

这一类包装UTF-8产生串从wchar_t串。

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

这会工作的阅读或书写的文件。

其他提示

你只要打开一个文件来处理采用的路径可以包含Unicode字,对吗?刚刚通过的路径 文件系统的代表fopen.

  • 如果路来自股票Mac OS X框架(例如,一个开放的小组是否碳或可可),你不需要做任何的转换上这并将能够使用它。

  • 如果你生成路径的一部分自己,你应该创建一个CFStringRef从你的路径,并然后获得,在文件系统表示通过向POSIX Api喜欢 openfopen.

一般来说,你就不必做了很多,对于大多数应用程序。例如,许多应用程序可能具有辅助数据文件存储用户的应用程序支持的目录,但只要该名称的这些文件是ASCII,并使用标准的Mac OS X Api找到用户的应用程序支助目录,你不需要做一大堆的偏执转换的路径建造这两个组成部分。

编辑,以增加: 我强烈警告 反对 任意变换一切UTF-8使用的东西喜欢 wcstombs 因为文件系统编码并不一定完全相同所产生的UTF-8。Mac OS X和窗都使用特定的(但不同)规范化分解规则》所用的编码于文件系统的途径。

例如,他们需要决定是否"é"将被储存作为一个或两个代码单位(或者 LATIN SMALL LETTER E WITH ACUTELATIN SMALL LETTER E 随后通过 COMBINING ACUTE ACCENT).这些将导致在两个不同的和不同长度的字节的序列,以及这两个Mac OS X和窗户的工作,以避免多个文件的同样的名字(作为用户认为他们)在相同的目录中。

该规则如何执行这一规范化分解可以得到漂亮的毛茸茸的,而不是试图实现它自己最好把它留到功能的系统框架提供了对于你来做繁重的工作。

@JKP:

不是所有功能在mac os X接受UTF8,但文件和文件路径可以UTF8,因此所有POSIX功能处理文件的访问(开,fopen,统计,等等)。 接受UTF8.

看看 在这里,.引用:

如何对文件的名称来看,API level 取决于API。目前的碳 Api处理文件的名字阵列 UTF-16字;POSIX的处理 他们作为一系列UTF-8,这是 为什么UTF-8工作以及在终端。如何 它的存储磁盘上取决于 盘格式;粮食安+使用UTF-16,但是 这不重要,在大多数情况下。

其他一些POSIX功能处理UTF8。E.g。功能处理的用户名称、组的名称或用户密码的使用UTF8储存的信息(这样一个用户名称可以是日本人和你的密码可能中国,没有问题)。

但并不是所有的处理UTF8.E.g。所有串职能的一个UTF8串仅仅是一个正常C String和文字上述126没有特殊的意义。他们不理解概念的多个字节(chars在C)形成一个单一的Unicode character.怎么其他Api处理char*指被传递给它们的不同API API。然而,作为一项规则的拇指,你可以说:

无论是功能只接受C串pure ASCII characters(仅范围在0至126),或者它将接受UTF8.通常功能不允许以上的字126和解释他们在任何其他编码于UTF8.如果这真的是种情况下,记录在案,然后必须有一个方法通过的编码与string.

如果你使用可可这是相当容易与NSString.只是载UTF16数据在使用initWithBytes:长:编码:(或者,也许-initWithCString:编码:),然后得到一个UTF8版本通过调UTF8String的结果。然后,刚才叫fopen你的新UTF8串的参数。

你绝对可以叫fopen与UTF-8串,不论语言-也帮不用C++在OS x虽然-对不起。

我已经阅读了文件名称从配置UTF8文件通过 wifstream (它使用 wchar_t 缓冲器)。

Mac执行情况不同的是Linux和窗户。wifstream读的每个字节从文件的独立wchar_t细胞在缓冲区。因此,我们有3个空字节,尽管 打开 需要 char string.因此可以使用的程序员 wcstombs 功能转换宽字符串多-byte string.

API支持UTF8.为了更好地理解使用的存储器察和六编对于您的文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top