visual texto studio salto linea code ajuste ajustar c++ visual-c++ unicode newline

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.