Re: STL-Streams und Unicode/UTF-16

Tech Tip: Click here to run a free scan for Windows Errors and optimize PC performance



Hallo!

"Ulrich Eckhardt" <doomster@xxxxxxxx> wrote:
Kommentar vorneweg: es gibt keine STL-Streams. Die STL enthaelt nur
Container, Iteratoren und Algorithmen.

Was, bitte, sind dann basic_xstream für Klassen?

Ausserdem ist sie veraltet bzw in
die C++ Standardlibrary aufgegangen.

Also ich bin ja der Meinung, die STL ist die C++-Standardlibrary. Sollte ich mich so täuschen? Und warum sind dann cout und cin im Namensraum Standard definiert?

Unicode ist kein Fileformat, trotz dessen was Notepad dir weissmachen will.

???
Machst du das mit Absicht? Das ist auch keine Korinthenkackerei, das ist bösartig!


#include <iostream>
#include <fstream>
#include <string>

Da fehlt noch <ostream> um portabel zu sein.

Wieso das? Ich möchte nun mal einen Stream, der aus Dateien lesen kann, keinen "normalen" Zeichenstream. Weiterhin fehlt, wenn überhaupt, <istream>, gell!?


Die Testdatei ist 1 Zeile UTF-16 ohne führendem BOM.

... aber scheinbar weisst Du dass es verschiedene Formate fuer Unicode
gibt. Nun, Punkt ist auf jeden Fall dass die Kodierung von wfstream (bzw
genauer codecvt<wchar_t,char,mbstate_t>) nicht irgendwie festgelegt ist,
daher kann eine Implementierung eigentlich alles machen, typischeweise
wird ein externes Byte auf ein internes Zeichen abgebildet.

Ähm, also ich bin ja der Meinung, wenn ich einen STL-Stream habe, der mit wchar_t instanziert wird, dann sind die Basiselemente im Stream 2 Byte große wchar_t (oder auch shorts). Gemeinhin passt das sehr gut auf UTF-16 kodierte Texte. Wenn ich also ein 1 Zeichen des Streams lese, sollte ich meiner Meinung nach *ein* UTF-16-Zeichen (bitte verzeiht mir die ausgelassene Surrogate und anderen Besonderheiten) bekommen, welches Windows direkt verarbeiten kann.

Als Ergebnis bekommt man einen String mit Leerzeichen zwischen den
Buchstaben oder bei MessageBoxW-Ausgabe nur den 1. Buchstaben.

Meinst Du nicht eher einen String mit NUL-Zeichen?

Nein, meine ich nicht. Vielleicht solltest du es vorher mal testen, wie die Ausgabe auf der Konsole aussieht?


Auch ios_base::binary hilft nicht.

Das macht auch etwas ganz anderes (wirst Du aber trotzdem brauchen!).

Was macht das denn deiner Meinung nach, als bestimmte Steuerzeichen nicht zu übersetzen?

Das ganze funktioniert erst, wenn man den
wifstream anders öffnet:
wifstream f(_wfopen(L"test.txt",L"rb"));

Naja, da das keine Standard-C++ Funktionalitaet ist kann es alles machen
was es will.

Sicherlich ist das kein Standardkonstruktor, ändert aber nichts daran, dass die Interna der Streams davon unberührt bleiben. Das holen der nächsten Zeichnen läuft doch nicht anders ab, da täusche ich mich bestimmt nicht.

Also, was Du brauchst ist eine zum Fileformat passende codecvt<> Facette
der Lokalen. Diese ist _nicht_ Bestandteil der C++ Standardlib aber wird
als Extension mitgeliefert oder laesst sich aus dem Netz ziehen oder
selber schreiben. Das ganze sieht dann so aus:

Wozu brauche ich hier eine Locale? Ich will doch keine regionstypische Übersetzung irgend welcher Daten. Ich möchte einfach ein 2 Byte grosses Zeichen verbünftig lesen können. Bisher war ich der Meinung, genau dafür sind die Streams da. Bei char geht es ja auch wie gewünscht. Und der Output via wofstream funktioniert ja auch!

Ansonsten, falls Du interesse hast, zieh' Dir mal "C++ IOStreams and
Locales" von Langer/Kreft rein.

Das wäre jetzt die erste sinvolle Information von dir, leider löst das nicht meine Frage sehr schnell.

MfG
Andreas

PS: Prinzipiell bin ich für jede Antwort dankbar, aber lies bitte deine nocheinmal unvoreingenommen! Wenn du mich nur wie einen dummen Schuljungen abkanzeln wolltest, dann finde ich meine Antwort vollkommen angemessen. Sollten wir uns nur missverstehen, und du mir wirklich helfen wollten, dann bitte ich um Entschuldigung.

.