O
Moin Leute
also, ich bin dabei, von der std::codecvt facet einen utf32->utf16 konvertierer abzuleiten. Er soll aus den intern genutzten unicode werten(integer) die für die ausgabe bestimmten utf16 strings basteln. Allerdings weis ich nicht, wie ich für die ausgabe das encoding nach BE/LE einstellen soll. Zwar gibt es den state parameter, den man an die entsprechenden funktionen des facets übergeben kann, aber so wie ich das verstanden hab, ist seine aufgabe die metadaten, die ein facet während des string umwandeln gesammelt hat - zb ob die codepage durch eine escape sequenz verändert wurde - für weitere darauffolgende konvertierungen zu speichern.
(also wenn man einen string "abcdefghi" hat, und man zuerst bis d codiert, dass dann im state parameter etwaige informationen für das codieren von e-i gespeichert werden).
Ich hab jetzt auch im internet nichts finden können, wie der state parameter genau verwendet wird. Deshalb hab ich mir überlegt, ob man das vielleicht so machen könnte:
//pseudocode
enum Endian
{
big,
little,
}
...
ifstream file("utf32datei");//man weis nicht ob BE oder LE und hofft,
//dass die infos in der datei enthalten sind
utf16string str;
file>>str;
...
codecvt<UTF32,UTF16,Endian>* facet=...;
Endian endianess;
utf32str str2;
facet->in(endianess,str1.begin(),...,str2.begin(),...);//hiernach könnte endianess=big sein
//zurück nach utf16
facet->out(endianess,str2.begin(),...,str1.begin(),..);
//oder, wenn man etwas direkt als LE ausgeben will:
endianess=little;
facet->out(endianess,...);
Kann man den state parameter so verwenden? oder bin ich da auf dem Holzweg? Wenn ja, gibt es alternative wege, wie man das Problem lösen könnte?