c++ - texto - salto de linea visual studio 2017
¿CRLF incorrecto en el flujo UTF-16? (1)
Cuando está imbue()
una nueva configuración regional en std::wofstream
, está borrando su configuración original. No use locale::empty()
, use su.getloc()
lugar, para que la nueva configuración regional su.getloc()
la configuración regional anterior antes de modificarla.
Además, en una nota lateral, el último parámetro de plantilla de codecvt_utf16
es una máscara de bits, por lo que codecvt_mode(generate_header + little_endian)
realmente debería ser std::generate_header | std::little_endian
std::generate_header | std::little_endian
en std::generate_header | std::little_endian
lugar.
su.imbue(std::locale(su.getloc(), new codecvt_utf16<wchar_t, 0x10ffffUL,
std::generate_header | std::little_endian>));
Este es un problema que no pude resolver a pesar de todos mis esfuerzos. Así que estoy totalmente atascado, ¡por favor ayuda!
Para el modo regular, "ASCII", las siguientes salidas simplificadas de archivos y secuencias
FILE *fa = fopen("utfOutFA.txt", "w");
fprintf(fa, "Line1/nLine2");
fclose(fa);
ofstream sa("utfOutSA.txt");
sa << "Line1/nLine2";
sa.close();
resultado, naturalmente, en exactamente los mismos archivos de texto (volcado hexadecimal):
00000000h: 4C 69 6E 65 31 0D 0A 4C 69 6E 65 32 ; Line1..Line2
donde la nueva línea /n
se expande a CRLF: 0D 0A
- típico para Windows.
Ahora, hacemos lo mismo para la salida Unicode, es decir, UTF-16 LE que es una especie de "predeterminado". Salida de archivo
FILE *fu = fopen("utfOutFU.txt", "w, ccs=UNICODE");
fwprintf(fu, L"Line1/nLine2");
fclose(fu);
resultados en este contenido:
00000000h: FF FE 4C 00 69 00 6E 00 65 00 31 00 0D 00 0A 00 ; ÿþL.i.n.e.1.....
00000010h: 4C 00 69 00 6E 00 65 00 32 00 ; L.i.n.e.2.
que se ve perfectamente correcto considerando BOM y endianness, incluyendo CRLF: 0D 00 0A 00
. Sin embargo, la salida de flujo similar
wofstream su("utfOutSU.txt");
su.imbue(locale(locale::empty(), new codecvt_utf16<wchar_t, 0x10ffffUL,
codecvt_mode(generate_header + little_endian)>));
su << L"Line1/nLine2";
su.close();
resultados en un byte menos y archivo de texto incorrecto general:
00000000h: FF FE 4C 00 69 00 6E 00 65 00 31 00 0D 0A 00 4C ; ÿþL.i.n.e.1....L
00000010h: 00 69 00 6E 00 65 00 32 00 ; .i.n.e.2.
La razón es una expansión incorrecta de CRLF: 0D 0A 00
. ¿Es esto un error? ¿O he hecho algo mal?
Uso el compilador de Microsoft Visual Studio (14.0 y otros). Intenté usar stream endl
lugar de /n
- ¡el mismo resultado! Traté de poner su.imbue()
primero y luego su.open()
- ¡todos iguales! También verifiqué la salida UTF-8 ( ccs=UTF-8
para el archivo y codecvt_utf8
para la transmisión) - no hay problema ya que CRLF se mantiene igual que en el modo ASCII: 0D 0A
Agradezco cualquier idea y comentario sobre el tema.