utf8 - utf 8 unicode




UTF-8 in Windows (3)

Aggiornamento 2018: Windows 10 ha reso la pagina di codice "65001" meno "pseudo" in due passaggi:

  1. modifiche di conhost : Windows Subsystem per Linux utilizza la codepage 65001 per le sue console. È anche possibile eseguire chcp 65001 in cmd.exe dal WSL. (Ha causato alcuni bug stupidi di Python .)
  2. impostazioni internazionali complete: Windows dalla versione 17035 consente di impostare UTF-8 come codepage delle impostazioni internazionali . Questo è disponibile dall'aggiornamento di aprile 2018.

Come imposto la codepage 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 codepage corrente, tuttavia se l'utente ha un nome di file con un carattere al di fuori della code page, questo si interrompe.

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

Come posso aggirare questo?


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

Stranamente, Windows ritiene che UTF-8 sia una codepage ai fini della conversione, quindi si utilizzano le stesse API che si dovrebbero convertire tra codepage:

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.


Sfortunatamente, non c'è modo di rendere Unicode l'attuale codepage in Windows. Le CP_UTF7 e CP_UTF8 sono pseudo-codepage, utilizzate solo nelle funzioni di conversione MultiByteToWideChar e WideCharToMultiByte , come menzionato da Ben.

Il tuo problema è simile a quello delle classi C ++ di 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 le maniglie.

L'unica soluzione a cui riesco a pensare è creare un file temporaneo con un nome non Unicode, che è hard-linked con l'originale, e usarlo come parametro.





utf-8