String umwandeln
-
@1: Wenn deine Zielfunktion nicht wirklich einen nicht-konstanten char-Zeiger braucht, kannst du dir das Kopieren ersparen und direkt mit From.c_str() arbeiten.
@2: Warum so umständlich? Eine direkte Zuweisung
To = From;reicht völlig aus.@3/4: Schau dir mal widen() (char->wchar_t) und narrow() (wchar_t->char) an.
-
Vielen Dank zu 1 und 2.
Zu 3 und 4:
Gibt es da nichts einfacheres? http://www.c-plusplus.net/forum/viewtopic-var-p-is-285374.htmlchar Narrow[6] = "Hallo"; wchar_t Widen[6]; _USE(cout.getloc(), ctype<wchar_t> ).widen(Narrow, Narrow+6, Widen);Sowas werde ich nicht in meinen Source schreiben! Dann lieber der einfache stdio.h Aufruf.
-
Mokka schrieb:
Sowas werde ich nicht in meinen Source schreiben!
Warum nicht?
-
Mokka schrieb:
Sowas werde ich nicht in meinen Source schreiben! Dann lieber der einfache stdio.h Aufruf.
Wenn du "Sowas" nicht in immer schreiben willst, sollte es doch kein Problem für dich sein es in eine Funktion zu packen,
z.B.:std::string wchar_tToString(wchar_t* str);Irgendwie "Sowas" halt.
Gruß
Don06
-
Es geht nur darum einen string in einen wchar_t umzuwandeln (und andersrum). Das ist zu kompilziert. Ausserdem verstehe ich nicht was da gemacht wird.
wchar_t Widen[6];
_USE(cout.getloc(), ctype<wchar_t> ).widen(Narrow, Narrow+6, Widen);Die Makrodefinitionen kann ich lustig in den MFC rekrusiv weiterverfolgen ohne das es für mich Sinn ergibt. Was die Parameter von widen darstellen sollen kann ich auch nur erraten. (Die VS6 IDE macht keine Vorschläge; ich habe keine AdminRechte, kann also auch nichts anderes installieren.)
Wenn es die Meinung der std::string Entwicklern war mbstowcs() zu verwenden und nicht myString.wchar_t() zu implementieren werde ich nicht dagegen halten!
-
@Don06: String Operationen sind grundlegend. Ich werde keine neuen String Operationen schreiben.
-
Es geht nur darum einen string in einen wchar_t umzuwandeln (und andersrum). Das ist zu kompilziert.
Du hast ein Designproblem, wie viele andere C++ler die string zu wstring und umgekehrt umwandeln wollen.
Wenn ich heute meine Software entwickle, dann so das sie immer keine Schwierigkeit mit Internationalisierung hat. Wie erreiche ich das? In dem ich grundsätzlich und durchgängig in meinen Programmen und Libs std::wstring benutze. (ich gehen jetzt von ISO-C++-Stdlib aus)
Nun, wenn du jetzt konvertieren willst, dann gebe ich dir folgenden Tip:
Knall folgende Headerdatei in deinen Header-Pfad rein, wo du ihn immer mit einem include erreichen kannst: http://www.c-plusplus.net/forum/viewtopic-var-t-is-168607-and-start-is-0-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-string2wstring.htmlWenn du irgendwo einen string aus char's hast, lässt du es erst garnicht soweit kommen, mit diesem in deinem Programm weiter zu arbeiten. Konvertiere diesen umgehend an der Eingabe-Schnittstelle in einen wstring! Fertig!
Du muß die Konvertierung nur an den Eingabeschnittstellen platzieren. Im gaaanzen restlichen Programm/Library hat wstring das Sagen!
Ausserdem verstehe ich nicht was da gemacht wird.
Muß man auch nicht unbedingt. Du mußt nur wissen, das eine Konvertierung immer die Locales mit einbeziehen muß. Ein 8 bit in ein 16 bit umwandeln ist im prinzip einfach, aber nicht wenn es um Strings geht!
-
Hallo Archi,
Du hast mich überzeugt wstring als Basistyp zu benutzen. Die Probleme der Konversion bleiben dadurch aber unverändert. Ich muß immer noch in bestimmte Apis einen char*, wchar_t* oder einen BSTR scheiben bzw holen.
Die Disskussion mit NES-Spieler habe ich interssiert gelesen und ich kann ihm nur beipflichten. Für jemanden der normalerweise in einer Hochsprache programmiert ist es schwer verständlich das solch grundlegende Funktionen im C++ Standard nicht zur Verfügung stehen.
-
Mokka schrieb:
Die Disskussion mit NES-Spieler habe ich interssiert gelesen und ich kann ihm nur beipflichten. Für jemanden der normalerweise in einer Hochsprache programmiert ist es schwer verständlich das solch grundlegende Funktionen im C++ Standard nicht zur Verfügung stehen.
Diese Funktionen stehen doch zur Verfügung - das ANSI Kommitee kann aber nichts dafür, wenn du sie nicht richtig einsetzen kannst. (und was hindert dich daran, den von Artchi verlinkten Code zu nehmen und einzusetzen?)
-
Es geht doch nur darum einen String zu konvertieren. Haben wir einen char* muss nur gesagt werden welcher Lokalisation er angehört und das wir ihn nach Unicode konvertieren möchten. Oder andersrum.
Man könnte also einfach eine Methode mit 2 Paramtern machen. Das da jetzt so ein komplizierter geschachtelter Makro_und_was_Weiß_ich Aufruf draus geworden ist kann man vermutlich nicht dem Ansi Institut anhängen.Jemand der nicht mit C++ vertraut ist und Artchis Code sieht würde denken: Brilliant... es wäre aber trotzdem nicht nötig gewesen "cout" neu zu implementieren.
-
Solange APIs immer noch auf char* oder string bestehen, wird man leider um die Konvertierung nicht umhinkommen. Das stimmt leider. Wenn du dir aber z.B. die Win32-API anschaust, wirst du sehen, das diese vollständig auf wchar_t* aufbaut und somit perfekt mit wstring zusammen arbeitet.
Was das Komitee angeht: 1998 hatte man glaube ich andere Sorgen als da etwas rundes zu vereinbaren. Aber es gibt definitiv im C++98 Spezifikationen um z.B. Streams mit unterschiedlichen codierten Daten in wstrings einzulesen. Das Problem ist eher, das die Stdlib-Implementierungen der Compiler hier defizite aufweisen.

In der Boost-Lib gibt es z.B. einen entsprechenden UTF-8-Konverter nach C++-Stdlib-Spec für wstrings. Viele Boost-Libs, wie boost.regex, boost.Options usw. nutzen diese Möglichkeit:
http://www.boost.org/libs/serialization/doc/codecvt.htmlVon Dinkumware gibts eine seeehr umfangreiche Sammlung von Konvertern, mit allen möglichen Codings:
http://www.dinkumware.com/manuals/?manual=compleat&page=index_cvt.html