Falsche CRLF im UTF-16-Stream?

9

Hier ist ein Problem, das ich trotz all meiner Bemühungen nicht lösen konnte. Also bin ich total fest, bitte helfe!

Für den regulären Modus "ASCII" die folgenden vereinfachten Datei- und Stream-Ausgaben

%Vor%

Ergebnis natürlich in genau den gleichen Textdateien (hex dump):

%Vor%

wobei die neue Zeile \n auf CRLF erweitert wird: 0D 0A - typisch für Windows.

Nun machen wir dasselbe für die Unicode-Ausgabe, nämlich UTF-16 LE, was eine Art "Standard" ist. Dateiausgabe

%Vor%

führt zu diesem Inhalt:

%Vor%

was unter Berücksichtigung von BOM und Endianz, einschließlich CRLF: 0D 00 0A 00 , vollkommen korrekt aussieht. Die Ausgabe des ähnlichen Streams ist jedoch

%Vor%

ergibt ein Byte weniger und eine insgesamt falsche Textdatei:

%Vor%

Der Grund ist eine falsche Erweiterung von CRLF: 0D 0A 00 . Ist das ein Fehler? Oder habe ich etwas falsch gemacht?

Ich benutze Microsoft Visual Studio Compiler (14.0 und andere). Ich habe versucht, Stream endl anstelle von \n - das gleiche Ergebnis! Ich habe versucht, su.imbue() zuerst und dann su.open() - egal! Ich habe auch die UTF-8-Ausgabe überprüft ( ccs=UTF-8 für Datei und codecvt_utf8 für Stream) - kein Problem, da CRLF die gleiche bleibt wie im ASCII-Modus: 0D 0A

Ich freue mich über Ideen und Kommentare zu diesem Thema.

    
lariona 19.09.2017, 19:54
quelle

1 Antwort

2

Wenn Sie imbue() ein neues Gebietsschema in std::wofstream einfügen, löschen Sie das ursprüngliche Gebietsschema. Verwenden Sie nicht locale::empty() , sondern su.getloc() , damit das neue Gebietsschema das alte Gebietsschema kopiert, bevor Sie es ändern.

Außerdem ist der letzte Template-Parameter von codecvt_utf16 eine Bitmaske, also sollte codecvt_mode(generate_header + little_endian) wirklich stattdessen std::generate_header | std::little_endian sein.

%Vor%     
Remy Lebeau 19.09.2017 20:15
quelle

Tags und Links