2011-02-17 21 views
10

Tengo archivo de texto ut8, que im lectura mediante simple:C++ cómo escribir/leer ofstream en Unicode/UTF8

ifstream in("test.txt"); 

ahora me gusta crear nuevo archivo que wll ser codificación ut8 o Unicode cómo puede hago esto con ofstream u otro? esto me crea codificación ansi.

ofstream out(fileName.c_str(), ios::out | ios::app | ios::binary); 
+0

¿Cómo que no es Unicode UTF-8? –

+0

Incluya un ejemplo de código mínimo pero completo que muestre el comportamiento que describe. –

+0

@ Jörgen - Unicode se puede codificar en muchos formatos, de los cuales UTF-8 es solo uno. El Unicode codificado en UTF-16 es, por ejemplo, tanto Unicode como Unicode codificado en UTF-8, pero es más probable que intentar decodificarlo como UTF-8 haga que su decodificador se bloquee y se queme. Entonces, es mejor tener claro de qué codificación está hablando la tabla de caracteres Unicode. –

Respuesta

5

Bien, sobre la variante portátil. Es fácil, si usa el estándar C++11 (porque hay muchos adicionales como "utf8", que resuelve este problema para siempre).

Pero si usted quiere usar el código multiplataforma con las normas más antiguas, puede utilizar este método para escribir con corrientes:

  1. Read the article about UTF converter for streams
  2. Añadir stxutif.h a su proyecto a partir de fuentes anteriormente
  3. Abra el archivo en modo ANSI y agregue la lista de materiales al inicio de un archivo, como este:

    std::ofstream fs; 
    fs.open(filepath, std::ios::out|std::ios::binary); 
    
    unsigned char smarker[3]; 
    smarker[0] = 0xEF; 
    smarker[1] = 0xBB; 
    smarker[2] = 0xBF; 
    
    fs << smarker; 
    fs.close(); 
    
  4. A continuación, abra el archivo como UTF y escribir su contenido allí:

    std::wofstream fs; 
    fs.open(filepath, std::ios::out|std::ios::app); 
    
    std::locale utf8_locale(std::locale(), new utf8cvt<false>); 
    fs.imbue(utf8_locale); 
    
    fs << .. // Write anything you want... 
    
+0

¿Podría explicar qué significa el punto 3? – ravwojdyla

+0

Guardando el archivo en el formato correcto. –

+0

"Las codificaciones UCS-2 y UTF-16 especifican la Marca de orden de byte (BOM) Unicode para usar al comienzo de los archivos de texto, que pueden usarse para la detección de pedidos de bytes (o detección de endiancias de bytes)." - http: // en.wikipedia.org/wiki/Byte_order_mark –

Cuestiones relacionadas