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
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.
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.
Tags und Links c++ visual-c++ unicode newline