Domanda

Come posso impostare la tabella codici su UTF-8 in un programma C Windows?

Ho una libreria di terze parti che utilizza fopen per aprire i file. Posso usare wcstombs per convertire i miei nomi di file Unicode nella tabella codici corrente, tuttavia se l'utente ha un nome file con un carattere esterno alla tabella codici, questo si interrompe.

Idealmente, chiamerei semplicemente _setmbcp (65001) per impostare la tabella codici su UTF-8, tuttavia la documentazione MSDN per _setmbcp afferma che UTF-8 non è supportato.

Come posso aggirare questo?

È stato utile?

Soluzione

Sfortunatamente, non è possibile rendere Unicode la tabella codici corrente in Windows. Le costanti CP_UTF7 e CP_UTF8 sono pseudo-codepage, utilizzate solo in MultiByteToWideChar e WideCharToMultiByte funzioni di conversione, come Ben citato.

Il tuo problema è simile a quello delle classi C ++ fstream. I costruttori fstream accettano solo nomi char * , rendendo impossibile l'apertura di un file con un vero nome Unicode. L'unica soluzione offerta da VC era un hack: aprire il file separatamente e quindi impostare l'handle sull'oggetto stream. Temo che questa non sia un'opzione per te, ovviamente, dal momento che la libreria di terze parti probabilmente non accetta handle.

L'unica soluzione che mi viene in mente è quella di creare un file temporaneo con un nome non Unicode, che è collegato all'originale e utilizzarlo come parametro.

Altri suggerimenti

Tutte le API di Windows pensano in UTF-16, quindi è meglio scrivere un wrapper attorno alla libreria che converta ai confini.

Stranamente, Windows pensa che UTF-8 sia una tabella codici ai fini della conversione, quindi usi le stesse API che converti tra le tabelle codici:

std::wstring Utf8ToUtf16(const char* u8string)
{
    int wcharcount = strlen(u8string);
    wchar_t *tempWstr = new wchar_t[wcharcount];
    MultiByteToWideChar(CP_UTF8, 0, u8string, -1, tempWstr, wcharcount);
    wstring w(tempWstr);
    delete [] tempWstr;
    return w;
}

E qualcosa di simile per riconvertire.

Aggiornamento 2018: Windows 10 ha effettuato il "65001" codepage meno " pseudo " in due passaggi:

    Modifiche
  1. conhost : il sottosistema Windows per Linux utilizza la code page 65001 per le sue console. È anche possibile eseguire chcp 65001 in cmd.exe da WSL. (Ha causato alcuni bug python piuttosto stupidi .)
  2. impostazioni internazionali complete: Windows dalla build 17035 consente di impostare UTF-8 come codice locale delle impostazioni . Questo è disponibile dall'aggiornamento di aprile 2018.

Usa cygwin (che fornisce un'impostazione internazionale UTF-8 per impostazione predefinita) o scrivi il tuo hack libc per Windows che esegue le necessarie traduzioni da UTF-8 a UTF-16 e avvolge _wfopen non standard . funzioni.

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