Pregunta

Tengo un archivo de texto que fue creado usando alguna herramienta de informes de Microsoft. El archivo de texto incluye la BOM 0xFFFE en el comienzo y luego la salida de caracteres ASCII con nulos entre los personajes (es decir, "F.i.e.l.d.1."). Puedo usar iconv a convertir esto en UTF-8 usando UCS-2LE como un formato de entrada y UTF-8 como un formato de salida ... funciona muy bien.

Mi problema es que quiero leer en las líneas del archivo UCS-2LE en cadenas y analizar los valores de los campos ya continuación escribirlos en un archivo de texto ASCII (es decir Field1 Field2). He probado las versiones string y wstring-base de getline -., Mientras se lee la cadena desde el archivo, funciona como substr(start, length) hacen interpretar la cadena como valores 8-bit, por lo que los valores de inicio y longitud están fuera

¿Cómo se leen los datos UCS-2LE en una cadena C++ y extraer los valores de los datos? He mirado boost y icu, así como numerosas búsquedas de Google, pero no he encontrado nada que funcione. ¿Que me estoy perdiendo aqui? Por favor, ayuda!

Mi código de ejemplo es el siguiente:

wifstream srcFile;
srcFile.open(argv[1], ios_base::in | ios_base::binary);
..
..
wstring  srcBuf;
..
..
while( getline(srcFile, srcBuf) )
{
    wstring field1;
    field1 = srcBuf.substr(12, 12);
    ...
    ...
}

Por lo tanto, si, por ejemplo, contiene srcBuf "W.e. t.h.i.n.k. i.n. g.e.n.e.r.a.l.i.t.i.e.s.", entonces la rentabilidad por encima del substr() ".k. i.n. g.e" en lugar de "g.e.n.e.r.a.l.i.t.i.e.s.".

Lo que quiero es leer en la cadena y procesarla sin tener que preocuparse acerca de la representación de varios bytes. ¿Alguien tiene un ejemplo del uso boost (o algo más) para leer estas cadenas desde el archivo y convertirlos a una representación de ancho fijo para uso interno?

Por cierto, estoy en un Mac usando Eclipse y gcc .. ¿Es posible que mi STL no comprende cadenas de caracteres anchos?

Gracias!

¿Fue útil?

Solución

substr me da buenos resultados en Linux con g ++ 4.3.3. El programa

#include <string>
#include <iostream>

using namespace std;

int main()
{
  wstring s1 = L"Hello, world";
  wstring s2 = s1.substr(3,5);
  wcout << s2 << endl;
}

impresiones "He aquí, w" como debería.

Sin embargo, la lectura del archivo probablemente hace algo diferente de lo que espera. Convierte los archivos de la codificación local a wchar_t, lo que hará que cada byte convirtiéndose en su propia wchar_t. No creo que la biblioteca estándar compatible con la lectura de UTF-16 en wchar_t.

Otros consejos

Después de haber pasado unas buenas horas abordar esta cuestión, aquí están mis conclusiones:

  • Lectura de un UTF-16 (o UCS2-LE) archivo es aparentemente manejable en C ++ 11, ver ¿Cómo se escribe una cadena codificada en UTF-8 a un archivo en windows, en C ++

  • Desde la biblioteca boost::locale es ahora parte de C ++ 11, uno sólo puede utilizar codecvt_utf16 (ver bullet a continuación para ejemplos de código eventuales)

  • Sin embargo, en los compiladores de más edad (por ejemplo MSVC 2008), puede utilizar locale y una faceta / "receta" codecvt costumbre, como muy bien ejemplificado en esta respuesta a presentar en modo binario

  • Alternativamente, se puede también tratar este método de la lectura, a pesar de que no funcionó en mi caso. La salida sería líneas que fueron sustituidos por los caracteres de basura que falta.

No fue capaz de hacer esto en mi pre-C ++ 11 compilador y tuvo que recurrir a las secuencias de comandos en Ruby y lanzando un proceso (es sólo en la prueba así que creo que ese tipo de complicaciones son bien allí) para ejecutar mi tarea.

Espero que esto recambios otros algún tiempo, encantados de ayudarle.

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