Pregunta

¿Cómo configuro la página de códigos para UTF-8 en un programa C Windows?

Tengo una biblioteca de terceros que utiliza fopen para abrir archivos. Puedo usar wcstombs para convertir mis nombres de archivo Unicode a la página de códigos actual, sin embargo, si el usuario tiene un nombre de archivo con un carácter fuera de la página de códigos, esto se rompe.

Idealmente, simplemente llamaría a _setmbcp (65001) para configurar la página de códigos en UTF-8, sin embargo, la documentación de MSDN para _setmbcp establece que UTF-8 no es compatible.

¿Cómo puedo evitar esto?

¿Fue útil?

Solución

Desafortunadamente, no hay manera de hacer que Unicode sea la página de códigos actual en Windows. Las constantes CP_UTF7 y CP_UTF8 son pseudocódigos, que se usan solo en MultiByteToWideChar y WideCharToMultiByte funciones de conversión, como Ben mencionó.

Su problema es similar al de las clases de C ++ fstream. Los constructores de fstream aceptan solo nombres char * , lo que hace imposible abrir un archivo con un verdadero nombre Unicode. La única solución ofrecida por VC fue un truco: abrir el archivo por separado y luego establecer el identificador al objeto de flujo. Me temo que esta no es una opción para usted, por supuesto, ya que la biblioteca de terceros probablemente no acepta identificadores.

La única solución que se me ocurre es crear un archivo temporal con un nombre que no sea Unicode, que está vinculado al original, y usarlo como parámetro.

Otros consejos

Todas las API de Windows piensan en UTF-16, por lo que es mejor escribir un contenedor alrededor de su biblioteca que se convierta en los límites.

Curiosamente, Windows piensa que UTF-8 es una página de códigos para fines de conversión, por lo que utiliza las mismas API que usaría para convertir entre páginas de códigos:

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

Y algo de forma similar para volver a convertir.

Actualización 2018: Windows 10 ha realizado el " 65001 " página de códigos menos " pseudo " en dos pasos:

  1. conhost cambios: Windows Subsystem for Linux usa la página de códigos 65001 para sus consolas. También es posible ejecutar chcp 65001 en cmd.exe desde WSL. (Ha causado algunos errores bastante tontos de Python ).
  2. local con todas las funciones: Windows desde la compilación 17035 permite configurar UTF-8 como la página de códigos del locale . Está disponible en la actualización de abril de 2018.

Utilice cygwin (que proporciona una configuración regional UTF-8 de manera predeterminada), o escriba su propio libc hack para Windows que realice las traducciones necesarias de UTF-8 a UTF-16 y envuelva el _wfopen no estándar, etc. . funciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top