2011-01-16 17 views
16

Estoy tratando de usar nuevos caracteres Unicode en C++ 0x. Así que escribió el código de ejemplo:Soporte Unicode en C++ 0x

#include <fstream> 
#include <string> 
int main() 
{ 
    std::u32string str = U"Hello World"; 

    std::basic_ofstream<char32_t> fout("output.txt"); 

    fout<<str; 
    return 0; 
} 

Pero después de ejecutar este programa que estoy consiguiendo archivo salida.txt vacía. Entonces, ¿por qué no está imprimiendo Hello World?

También hay algo así como un cout y cin ya definida para estos tipos o stdin y stdout no soporta Unicode?

Editar: Estoy usando g ++ y Linux.

EDITAR: АТТЕNTION. Descubrí que ese comité estándar descartaba las transmisiones de Unicode de C++ 0x. Entonces la respuesta previamente aceptada ya no es correcta. Para obtener más información, consulte my answer!

+0

¿El archivo está vacío porque tiene 0 bytes o está vacío porque su editor de texto no muestra ningún carácter imprimible? – Gabe

+1

@Gabe it hase 0 bytes – UmmaGumma

+0

¿Qué versión de gcc estás usando? – ssmir

Respuesta

6

Literales de cadena Unicode admiten began en GCC 4.5. Tal vez ese es el problema.

[editar]

Después de algo de investigación he encontrado que las corrientes para este nuevo literales Unicode se describe en N2035 y fue included en un borrador de la norma. De acuerdo con este documento, necesita u32ofstream para generar la cadena, pero esta clase está ausente en la biblioteca GCC 4.5 C++ 0x.

Como solución alternativa se puede utilizar fstream ordinaria:

std::ofstream fout2("output2.txt", std::ios::out | std::ios::binary); 
fout2.write((const char *)str.c_str(), str.size() * 4); 

De esta manera no tengo salida de la cadena en UTF-32LE en mi máquina Intel (que es ascendente hacia la izquierda).

[editar]

que era un poco mal sobre el estado de u32ofstream: de acuerdo con el latest draft en web site del Comité de Normas ++ El C tiene que usar std::basic_ofstream<char32_t> como lo hizo. Esta clase utilizaría la clase codecvt<char32_t,char,typename traits::state_type> (consulte el final de §27.9.1.1) que debe implementarse en la biblioteca estándar (busque codecvt<char32_t en el documento), pero no está disponible en GCC 4.5.

+0

Estoy ejecutando gcc 4.5.2 y obteniendo el mismo resultado que el OP :( –

+0

Según Grigory Javadyan no es un problema. :( – UmmaGumma

+0

He intentado con mi gcc 4.5 y he editado mi respuesta – ssmir

1

Al crear, la secuencia intenta obtener un 'codecvt' de la configuración regional global, pero no puede obtener uno porque los únicos codecvt estándar son para char y wchar_t. Como resultado, el miembro _M_codecvt del objeto de secuencia es NULL. Más tarde, durante el intento de salida, su código arroja una excepción (no visible para el usuario) en la función de comprobación de facetas en basic_ios.h, porque la faceta se inicializa desde _M_codecvt.

Agregue una faceta al local asociado con la secuencia para hacer la conversión de char32_t a la salida correcta. Imbuir la secuencia con una configuración regional que contiene un codecvt del tipo correcto.

+0

Código de C++ mi respuesta contiene un ejemplo de cómo leer/escribir secuencias basadas en 'wchar_t' en' 'utf-8'' de la manera descrita en tu respuesta http://stackoverflow.com/questions/2522152/python-is-a-dictionary-slow -to-find-frequency-of-each-character/2525617 # 2525617 – jfs

3

En el nuevo estándar C++ no habrá flujos Unicode.

Como mencionó @ssmir, el comité estándar iba a agregar compatibilidad de transmisión para Unicode en C++ 0x. Sin embargo, en las ediciones de características, el comité decidió eliminar el soporte de transmisión para Unicode.Para obtener más información, consulte este link.

Parece que la única forma de dar salida a la cadena Unicode es convertirla en una cadena ASCII con codecvt.

+0

¿Dónde se supone ssmir? Su enlace es para un documento de 4 años. – Potatoswatter

+1

El estándar contiene streams Unicode al menos en th e último borrador. Ver mi respuesta editada. – ssmir

+0

¿exactamente qué respuesta? ¿cómo? Necesito usar algo como cout, pero tengo una u32string que necesito enviar. http://en.wikipedia.org/wiki/C%2B%2B11 me muestra cómo crear cadenas de caracteres unicode, y miré dentro de los encabezados de cadenas de gcc para encontrar u32string. –