Estoy de programación (sólo ocasionalmente) en C++ con visual studio y MFC. Escribo un archivo con fopen y fprintf. El archivo debe ser codificado en UTF8. Hay alguna posibilidad de hacerlo? Lo que yo trato, el archivo es el doble de bytes unicode o ISO-8859-2 (latin2) codificado.

Glanebridge

Ver otros posts acerca de Unicode en C++ stackoverflow.com/questions/55641/unicode-in-c
Usted puede tratar de ver este hilo [enter enlace aquí la descripción][1] [1]: stackoverflow.com/questions/2543346/…

OriginalEl autor Glanebridge | 2012-04-05

3 Comentarios

  1. 2

    Que no es necesario para establecer la configuración regional o establecer cualquier de los modos especiales en el archivo si sólo desea utilizar fprintf. Usted simplemente tiene que usar la codificación UTF-8 cuerdas.

    #include <cstdio>
    #include <codecvt>
    
    int main() {
        std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>,wchar_t> convert;
        std::string utf8_string = convert.to_bytes(L"кошка 日本国");
    
        if(FILE *f = fopen("tmp","w"))
            fprintf(f,"%s\n",utf8_string.c_str());
    }

    Guarde el programa como UTF-8 con la firma o UTF-16 (es decir, no usar UTF-8, sin firma, de lo contrario VS no va a producir el derecho literal de cadena). El archivo escrita por el programa contendrá el formato UTF-8 versión de esa cadena. O usted puede hacer:

    int main() {
        if(FILE *f = fopen("tmp","w"))
            fprintf(f,"%s\n","кошка 日本国");
    }

    En este caso, debe guardar el archivo como UTF-8 sin firma, porque desea que el compilador de pensar que el origen de la codificación es la misma que la ejecución de la codificación… Esto es un poco de un hack que se basa en el compilador, la OMI, el comportamiento erróneo.

    Que usted puede hacer básicamente lo mismo con cualquiera de las otras Api para escribir estrecho de caracteres en un archivo, pero tenga en cuenta que ninguno de estos métodos de trabajo para la escritura de UTF-8 a la consola de Windows. Debido a que el tiempo de ejecución de C y/o la consola es un poco roto sólo se puede escribir UTF-8 directamente a la consola haciendo SetConsoleOutputCP(65001) y, a continuación, utilizando uno de los puts variedad de la función.

    Si desea utilizar caracteres anchos en lugar de estrechar los personajes, a continuación, configuración regional basada en métodos y modos de configuración en el archivo descriptores podría entrar en juego.

    #include <cstdio>
    #include <fcntl.h>
    #include <io.h>
    
    int main() {
        if(FILE *f = fopen("tmp","w")) {
            _setmode(_fileno(f), _O_U8TEXT);
            fwprintf(f,L"%s\n",L"кошка 日本国");
        }
    }

    #include <fstream>
    #include <codecvt>
    
    int main() {
        if(auto f = std::wofstream("tmp")) {
            f.imbue(std::locale(std::locale(),
                    new std::codecvt_utf8_utf16<wchar_t>)); //assumes wchar_t is UTF-16
            f << L"кошка 日本国\n";
        }
    }
    Esto sólo funciona con C++11 en VC10+.
    El primer ejemplo utiliza wstring_convert de C++11, pero cualquier otro método de obtención de la codificación UTF-8 también funciona, por ejemplo, WideCharToMultiByte. El último ejemplo se utiliza un C++11 codecvt faceta para la que no hay un built-in, pre-c++11 de reemplazo. Los otros dos ejemplos no usar C++11.

    OriginalEl autor bames53

  2. 2

    Sí, pero es necesario Visual Studio 2005 o posterior. Usted puede hacer una llamada a fopen con los parámetros:

    LPCTSTR strText = "абв";
    FILE *f = fopen(pszFilePath, "w,ccs=UTF-8");
    _ftprintf(f, _T("%s"),  (LPCTSTR) strText);

    Tenga en cuenta que esta es la extensión de Microsoft, probablemente no funcionarán con gcc o de otros compiladores.

    No creo que esto afectará a los datos que se escriben en el archivo mediante fprintf.
    Usted necesidad de utilizar _ftprintf. Ver los cambios en mi respuesta.
    O simplemente utilizar fwprintf. Lo que pasa es que ccs=UTF-8 establece el _O_U8TEXT modo en el archivo, de modo que la escritura de caracteres anchos para el archivo de la causa UTF-8 a la salida. Escrito estrecho personajes con este modo de juego, se producirá un error.
    ¿Quiere usted decir que usted ya tiene un buffer con texto UTF-8? En ese caso, ¿por qué no acaba de abrir el archivo en modo binario y escribir el buffer con fwrite?
    No, me refiero a que ya que el uso de tprintf sólo trabajo aquí si TCHAR y todos los T de las funciones de resolver a wchar_t funciones por qué no usar simplemente el wchar_t funciones directamente? TCHAR sólo es útil cuando un programa es en realidad va a cambiar entre char y wchar_t. Si usted no desea utilizar ambos, entonces no hay razón para utilizar TCHAR. FILE* f = fopen(filename,"w,css=UTF-8"); fwprintf(f,L"%s",L"абв");

    OriginalEl autor sashoalm

Dejar respuesta

Please enter your comment!
Please enter your name here