Domanda

Sto cercando l'equivalente di Windows _wfopen() sotto Mac OS X.Qualche idea?

Ho bisogno di questo per porto una libreria di Windows che utilizza wchar* per la sua interfaccia di File.Come questo è destinato ad essere un cross-piattaforma libreria, io sono in grado di fare affidamento su come l'applicazione client per ottenere il percorso del file e dare alla biblioteca.

È stato utile?

Soluzione

API POSIX in Mac OS X sono utilizzabili con la codifica UTF-8 corde.Per convertire un wchar_t stringa UTF-8, è possibile utilizzare il CoreFoundation quadro da Mac OS X.

Qui è una classe che verrà a capo di un UTF-8 stringa generata da un wchar_t stringa.

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

Utilizzo:

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

Questo sarà il lavoro per la lettura o la scrittura dei file.

Altri suggerimenti

Si desidera solo per aprire un handle di file utilizzando un percorso che può contenere caratteri Unicode, giusto?Passare solo il percorso in filesystem rappresentazione per fopen.

  • Se il percorso è venuto da stock Mac OS X quadri (per esempio, un pannello Aperto se Carbonio o di Cacao), non è necessario fare alcuna conversione e saranno in grado di usarlo così com'è.

  • Se si sta generando parte del percorso da soli, si dovrebbe creare un CFStringRef dal tuo cammino, e quindi ottenere che nel filesystem rappresentazione di passare a POSIX Api come open o fopen.

In generale, non hanno a che fare un sacco di che per la maggior parte delle applicazioni.Per esempio, molte applicazioni possono avere ausiliario file di dati memorizzati Applicazione utente directory di Supporto, ma i nomi di questi file sono in formato ASCII, e si utilizza standard di Mac OS X Api per localizzare l'utente dell'Applicazione Supporto directory, non hai bisogno di fare un po ' di paranoid conversione di un percorso costruito con questi due componenti.

Edito per aggiungere: Vorrei fortemente attenzione contro arbitrariamente la conversione di tutto in UTF-8 con qualcosa di simile wcstombs perché filesystem di codifica non è necessariamente identico al generato UTF-8.Mac OS X e Windows, sia per uso specifico (ma diverso) canonica di decomposizione regole per la codifica utilizzata nel filesystem percorsi.

Per esempio, hanno bisogno di decidere se "é" verrà archiviato come uno o due unità di codice (sia LATIN SMALL LETTER E WITH ACUTE o LATIN SMALL LETTER E seguito da COMBINING ACUTE ACCENT).Questi si tradurrà in due diverse e di diversa lunghezza in sequenze di byte, e sia per Mac OS X e Windows per evitare di mettere più file con lo stesso nome (come l'utente percepisce) nella stessa directory.

Le regole per eseguire questa canonica di decomposizione può ottenere abbastanza peloso, quindi, piuttosto che provare a realizzare da soli è meglio lasciare le funzioni che il sistema quadri sono a disposizione di tutti per fare il sollevamento di carichi pesanti.

@JKP:

Non tutte le funzioni MacOS X accettare UTF8, ma i nomi dei file e i percorsi possono essere UTF8, quindi tutte le funzioni POSIX trattare con l'accesso ai file (apertura, fopen, statistica, etc.) accettare UTF8.

Vedere qui.Citazione:

Come un nome di file sembra a livello di API dipende dalle API.Corrente Di Carbonio Le api di gestire i nomi di file come un array di UTF-16 caratteri;POSIX quelli maniglia come un array di UTF-8, che è perché UTF-8 funziona bene nel Terminale.Come è memorizzato sul disco dipende dalla formato del disco;HFS+ utilizza UTF-16, ma non è importante nella maggior parte dei casi.

Alcune altre funzioni POSIX gestire UTF8 come bene.E. g.funzioni di trattare con i nomi utente, nomi di gruppo o utente password usare UTF8 per memorizzare le informazioni (quindi un nome utente può essere Giapponese e la tua password può essere Cinese, nessun problema).

Ma non di gestire tutte le UTF8.E. g.per tutte le funzioni di stringa di un UTF8 stringa è solo una normale Stringa C e personaggi al di sopra di 126 hanno alcun significato speciale.Non capiscono il concetto di più byte (caratteri in C) la formazione di un singolo carattere Unicode.Come altre Api gestire char * puntatore di essere passati per loro è diverso da API API.Tuttavia, come regola del pollice che si può dire:

La funzione accetta solo stringhe C con puro caratteri ASCII (solo nell'intervallo da 0 a 126) o di accettare UTF8.Di solito le funzioni non permettono di caratteri superiori a 126 e a interpretarli in qualsiasi altra codifica di UTF8.Se questo era davvero il caso, è documentato e poi ci deve essere un modo per passare la codifica con la stringa.

Se si sta utilizzando il Cacao è abbastanza facile con NSString.Basta caricare il UTF16 dati in uso -initWithBytes:lunghezza:codifica:(o forse -initWithCString:codifica:) e quindi ottenere un UTF8 versione chiamando UTF8String sul risultato.Quindi, basta chiamare fopen con il nuovo UTF8 stringa come parametro.

Si può sicuramente chiamare fopen con una stringa UTF-8, indipendentemente dalla lingua - non può aiutare con C++ su OSX, anche se - mi dispiace.

Ho letto il nome del file di configurazione e file UTF8 attraverso wifstream (usa wchar_t buffer).

Implementazione di Mac è diverso da Linux e Windows.wifstream legge ogni byte dal file separato wchar_t cella nel buffer.Quindi abbiamo 3 vuoto byte, anche se aperto richiede char stringa.Così programmatore può utilizzare wcstombs funzione per la conversione di ampia stringa di caratteri multi-byte della stringa.

L'API supporta UTF-8.Per comprendere meglio l'utilizzo di memoria watcher e un hex editor per il file.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top