std::string <-> std::wstring
-
Darf ich aus Interresse fragen, wofür du die Umwandlung brauchst? Vielleicht lässt sie sich ja vermeiden und du kommst nur mit wstring aus...
-
Hi,
die Umwandlung std::wstring -> std::string brauch ich für diverse API-Aufrufe (v.a. DirectX), den umgekehrten Fall auch, aber den noch zusätzlich für eine Stelle (beim Exception Callstack Tracing), wo ich keine weitere Funktion die potentiell throwt aufrufen darf und deswegen mit const char*s arbeite. Später soll das dann aber in std::wstrings umgewandelt werden. (wobei das ja optimal ist, da hier kein std::string vorkommt, aber wie gesagt, es gibt auch Fälle, wo ich string <-> wstring nicht vermeiden kann)
ChrisM
-
Für die ganze WinAPI und DX gibt es ab Win2000 für alle Funktionen Unicode-Versionen. Ich persönlich habe nen normalen char noch nicht gebraucht.
Außerdem arbeitet Win2000 intern mit 2Bytes pro Zeichen, wenn du ne nicht Unicode-Version aufrufst, dauert das sogar länger.Nachtrag: Alle Funktionen haben zwei Versionen, zum Beispiel gibt es MessageBoxA() für ANSI und MessageBoxW() für Unicode.
Wenn du MessageBox() aufrufst, wird eins von den beiden genommen, je nachdem, ob du _UNICODE defined hast.
Ich hoffe das hilft dir weiter. Wie gesagt, es ist optimaler, mit den Unicode-Versionen zu arbeiten.
-
Hi,
ich weiß, ich verwende jetzt auch überall durchgängig, nur ein Problem gibt es noch und zwar betrifft das meinen Dateizugriff.
Obwohl ich jetzt schon std::wofstream (soweit ich das sehe, bezieht sich das w aber nur auf das, was geschrieben wird :() verwende, brauche ich trotzdem noch einen const char* bei std::wofstream::open(). Den könnte ich zwar schnell durch Konvertierung erhalten, aber vielleicht hat ja eine Idee, wie ich das auch noch richtig hinkriege.
ChrisM
-
Hoffen, dass die Implementierung eine Erweiterung parat hat?
Die stdlib und boost.filesystem wehren sich leider immer noch vor wchar_t-Dateinamen...
Bleibt AFAIK nur, einen eigenen streambuf zu schreiben
-
Wird in die Datei dann überhaupt im Unicode Format geschrieben? Mir ist das nämlich mit wofstream noch nicht gelungen. Alles was ich geschrieben habe, stand dann in der Datei im ANSI-Format.
Deshalb benutz ich da meistens immer noch ne WinAPI-Funktion (der kann man den Dateinamen auch als wstring übergeben).
-
ANSI-Format oder ASCII?
Außerdem lässt sich ein UNICODE-Zeichen ja aus zwei ASCII-Zeichen zusammensetzen bzw. aus 2 Byte.
-
Das ändert nix daran, das wenn ich nen Unicode string übergebe, dass in der Datei dann trotzdem alles im ANSI Format steht. Wie willst du da bitte was zusammensetzen, wenn du schreibst
myStream << L"bla blubb";
btw. ASCII legt nur die ersten 7 Bits fest, da gibt es nur 128 verschiedene Zeichen.
-
Hi,
@Optimizer: Keine Ahnung, ich konnte es noch nicht testen, weil open() ja meinen Unicode-Dateinamen nicht annimmt.
Und API-abhängige Funktionen möchte ich nicht verwenden.
Gibt's denn keine Möglichkeit, den Dateinamen bei File Streams irgendwie in Unicode anzugeben?
ChrisM
-
Hi,
das gibt's doch net. Soll das heißen, hier ist niemand, der schonmal mit Unicode und der STL eine Datei geöffnet hat?
ChrisM
-
das geht nicht. Irgend wann hatten wir darüber mal einen Thread.
Wenn du Unicode Dateinamen hast, musst du versuchen über UTF-8 zu gehen.