Pergunta

Eu estou olhando para o equivalente do Windows _wfopen() em Mac OS X.Alguma idéia?

Eu preciso esta na ordem porta de uma biblioteca do Windows que usa wchar* para o seu Arquivo de interface.Como esta é concebida para ser uma plataforma de biblioteca, eu sou incapaz de depender de como o aplicativo cliente irá obter o caminho do arquivo e dê para a biblioteca.

Foi útil?

Solução

API POSIX no Mac OS X são utilizáveis com a codificação UTF-8 cordas.Para converter um wchar_t de seqüência de caracteres UTF-8, é possível usar o CoreFoundation o quadro a partir do Mac OS X.

Aqui é uma classe que vai envolver um UTF-8 gerada seqüência de caracteres a partir de um wchar_t de seqüência de caracteres.

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

Uso:

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

Isto irá funcionar para a leitura ou escrita de arquivos.

Outras dicas

Você só quer abrir um identificador de arquivo usando um caminho que pode conter caracteres Unicode, certo?Basta passar o caminho em sistema de arquivos representação para fopen.

  • Se o caminho veio do estoque Mac OS X quadros (por exemplo, um painel Aberto se de Carbono ou de Cacau), você não precisará fazer qualquer tipo de conversão no e será capaz de usá-lo como está.

  • Se você está gerando parte do caminho, você deve criar um CFStringRef do seu caminho e, em seguida, obter que no sistema de arquivos representação para passar para POSIX APIs como open ou fopen.

Em geral, você não terá que fazer um monte de que para a maioria das aplicações.Por exemplo, muitas aplicações podem ter auxiliares arquivos de dados armazenados no Aplicativo do usuário diretório de Suporte, mas contanto que os nomes dos arquivos são ASCII, e você usar o padrão do Mac OS X APIs para localizar o usuário do Aplicativo de Suporte de diretório, você não precisa fazer um monte de paranóico conversão de um caminho construído com esses dois componentes.

Editado para acrescentar: Eu fortemente cuidado contra arbitrariamente, convertendo tudo para UTF-8 usando algo como wcstombs porque o sistema de arquivos de codificação não é necessariamente idêntico ao gerado UTF-8.O Mac OS X e Windows, tanto de uso específico (mas diferentes) decomposição canônica regras para a codificação utilizada no sistema de arquivos caminhos.

Por exemplo, eles precisam decidir se "é" será armazenado como uma ou duas unidades de código (ou LATIN SMALL LETTER E WITH ACUTE ou LATIN SMALL LETTER E seguido por COMBINING ACUTE ACCENT).Estes irão resultar em dois diferentes — e diferentes-comprimento — sequências de bytes, e Mac OS X e Windows de trabalho para evitar colocar vários arquivos com o mesmo nome (como o usuário percebe-los) no mesmo diretório.

As regras para saber como efectuar este canônico de decomposição pode ficar muito peludo, então ao invés de tentar implementá-lo é melhor deixá-lo para as funções que o sistema quadros fornecidos para que você faça o trabalho pesado.

@JKP:

Nem todas as funções no MacOS X aceitar UTF8, mas nomes de arquivos e filepaths pode ser UTF-8, assim todos os POSIX funções de lidar com o acesso a arquivos (abrir, fopen, estatística, etc.) aceitar UTF8.

Ver aqui.Citação:

Como um nome de arquivo olha o nível da API depende da API.Corrente De Carbono APIs manipular nomes de arquivo como uma matriz de UTF-16 caracteres;POSIX queridos lidar com como um array de UTF-8, que é por UTF-8 funciona bem no Terminal.Como ele é armazenado no disco depende do formato de disco;HFS+ usa UTF-16, mas isso não é importante, na maioria dos casos.

Alguns outros POSIX funções identificador de UTF8 bem.E. g.funções de lidar com nomes de usuário, nomes de grupo ou de usuário, senhas de uso de UTF8 para armazenar as informações (portanto, um nome de utilizador pode ser Japonês e a sua palavra-passe pode ser Chinês, não há problema).

Mas nem todas lidar com UTF-8.E. g.para todas as funções de seqüência de caracteres de uma seqüência de caracteres UTF8 é apenas um normal C Cadeia de caracteres e caracteres acima 126 tem nenhum significado especial.Eles não entendem o conceito de múltiplos bytes (caracteres em C), formando um único caractere Unicode.Como outras APIs de lidar char * pointer sendo passado para eles é diferente do API a API.No entanto, como uma regra como a do polegar, você pode dizer:

A função só aceita C seqüências de caracteres com caracteres ASCII puro (somente no intervalo de 0 a 126), ou ele vai aceitar UTF8.Geralmente funções não permitir caracteres acima 126 e interpretá-las em qualquer outra codificação de UTF8.Se esse foi realmente o caso, é documentado e, em seguida, deve haver uma maneira de passar a codificação, juntamente com a seqüência de caracteres.

Se você estiver usando o Cacau é bastante fácil com NSString.Basta carregar a UTF16 de dados utilizando -initWithBytes:comprimento:codificação:(ou talvez -initWithCString:codificação:) e, em seguida, obter um UTF8 versão chamando utf8-string com o resultado.Em seguida, basta ligar fopen com a sua nova seqüência de caracteres UTF8 como o param.

Você pode definitivamente chamada fopen com uma string UTF-8, independentemente da língua - não pode ajudar com o C++ em OSX que - desculpe.

Eu li o nome do arquivo de configuração do arquivo UTF8 através de wifstream (ele usa wchar_t buffer).

Implementação Mac é diferente do Linux e do Windows.wifstream lê cada byte do arquivo para separar wchar_t de células no buffer.Portanto, temos 3 bytes vazias, embora aberto requer char seqüência de caracteres.Assim, o programador pode usar wcstombs função para converter a cadeia de caracteres multi-byte string.

A API suporta UTF-8.Para uma melhor compreensão, o uso de memória do observador e editor hexadecimal para o seu arquivo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top