UNICODE to wstring

Thomasio

Erfahrenes Mitglied
Ich habe mich mal wieder heillos verfahren beim konvertieren von strings.

Situation:
Mein Webseiten-Provider erlaubt keinen externen Zugriff auf MySql, nur PHP Scripts auf der Seite selbst können zur Datenbank verbinden.
Darum hat meine C++ Anwendung kein mysql++ eingebaut, sondern ruft via WinInet ein PHP Script auf der Webseite auf, was die gewünschten Daten aus der Datenbank liest und über WinInet an meine Anwendung zurück gibt.
Probleme mit Zugriffsrechten habe ich gelöst, übrig ist nur ein kleines

Konvertier-Problem:
Alle Daten in der DB sind in UNICODE, das PHP Script liest das auch als UNICODE und gibt es auch als UNICODE weiter, aber WinInet liest die Daten in ein char[]-Array.

Code:
unsigned long len;
string CompleteBuffer = "";
do{
char antwortbuffer[1000];
InternetReadFile(request,antwortbuffer,999,&len);
antwortbuffer[len] = '\0';
string temp(antwortbuffer);
CompleteBuffer = CompleteBuffer + temp;
} while(len);

Solange alle strings nur "normale" Zeichen enthalten, ist das kein Problem, ich kann mit mbstowcs() meinen string zu wstring konvertieren und fertig, aber sobald Sonderzeichen wie "äöü" drin sind gibt das Murks, logisch.

Die Frage ist also: Nachdem ich vorher schon weiss, dass der antwortbuffer UNICODE enthält, wie kann ich es anstellen, direkt wstring draus zu machen, ohne dass ich auf dem Umweg über string und mbstowcs() die Sonderzeichen verliere?
 
Also wenn die Daten bereits als UNICODE übermittelt werden kannst du sie direkt als solche interpretieren:
Code:
std::wstring CompleteBuffer = "";
...
std::wstring temp((LPWSTR)antwortbuffer);
CompleteBuffer += tmp;
 
Woah! Das ist mal ne Lösung, ich kanns kaum glauben, dass das so einfach sein soll, muss ich direkt ausprobieren.
Auf jeden Fall vielen Dank.
 
Hi.

Wenn du die Länge der Daten schon kennst, brauchst du noch nicht mal eine temp. Variable.

Und in C++ sollte man die neuen Cast-Operatoren benutzen:
C++:
std::wstring CompleteBuffer; // leer
...
CompleteBuffer.append(reinterpret_cast<LPWCSTR>(antwortbuffer), len);
Kann nicht schaden, ab und zu mal in die C++ Standardbibliothek zu schauen... ;)

Gruß

PS: Außerdem ist UNICODE kein Zeichensatz. Es könnte sich um UTF-16 LE, UTF-16 BE, UTF-8 usw. handeln. Da müßtest aufpassen was PHP da eigentlich liefert.
 
Zuletzt bearbeitet:
Was PHP da liefert stell ich ihm ja selber ein, beim Verbinden zur DB setze ich das auf UTF-8 und weil alle Textfelder in der DB ebenfalls UTF-8 sind, kann ich mir sicher sein, dass von da ausschliesslich UTF-8 kommt.
mysql_query("SET names 'utf8'");

Trotzdem natürlich danke für den Zusatz, das macht es gleich nochmal einfacher.
 
Was PHP da liefert stell ich ihm ja selber ein, beim Verbinden zur DB setze ich das auf UTF-8 und weil alle Textfelder in der DB ebenfalls UTF-8 sind, kann ich mir sicher sein, dass von da ausschliesslich UTF-8 kommt.
mysql_query("SET names 'utf8'");
UTF-8 ist allerdings inkompatibel zu wchar_t, da UTF-8 ASCII kompatibel ist und somit als Folge von char gespeichert wird.

Du müßtest mit der MultiByteToWideChar Funktion von CP_UTF8 konvertieren um die Daten in einen wstring zu bekommen.

Gruß
 
Zuletzt bearbeitet:
Womit wir dann wieder bei der original Frage wären, nur leicht verändert:
Wenn ich weiss, dass im char[] UTF-8 ist, wie bekomme ich das in einen wstring?

MultiByteToWideChar kenne ich im Zusammenhang mit string to wstring, aber genau dabei verliere ich ja die Sonderzeichen.

Oder anders gefragt: Wie müsste das im Ganzen aussehen, für meinen Code von oben?
 
MultiByteToWideChar kenne ich im Zusammenhang mit string to wstring, aber genau dabei verliere ich ja die Sonderzeichen.
Nein, damit bleiben alle Sonderzeichen erhalten - wenn man es richtig macht... ;-)
Oder anders gefragt: Wie müsste das im Ganzen aussehen, für meinen Code von oben?
Du rufst MultiByteToWideChar mit den entsprechenden Parametern (CP_UTF8 - siehe MSDN) und NULL als Ausgabepuffer um festzustellen wie groß der Ausgabepuffer werden muss, dann allozierst du dafür genügend Speicher und rufst die Funktion nochmal auf.

Aber was rede ich eigentlich... Du hast bereits von MCoder entsprechenden Code bekommen -> http://www.tutorials.de/c-c/324437-wstring-base64.html#post1674329

Gruß
 
Ähm ja, DEN Code verwende ich seit damals in zig Funktionen, weil es z.B. beim send und recv über Sockets sehr praktisch ist, aber irgendwie bringe ich die Verbindung nicht auf die Reihe.
Nur jetzt wo du das sagst .....
Kann es sein, dass ich einfach nur den Wald zwischen den Bäumen nicht sehe?
Oder anders gefragt: Ist das, was mein PHP Script mir da sendet genau das selbe, was ich raus bekomme, wenn ich nach MCoder wstring via WideCharToMultiByte zu string konvertiere, sprich ich kann die Funktion die ich mir damals gebastelt habe hier auch wieder verwenden?
 
Ähm ja, DEN Code verwende ich seit damals in zig Funktionen, weil es z.B. beim send und recv über Sockets sehr praktisch ist, aber irgendwie bringe ich die Verbindung nicht auf die Reihe.
Nur jetzt wo du das sagst .....
Kann es sein, dass ich einfach nur den Wald zwischen den Bäumen nicht sehe?
Oder anders gefragt: Ist das, was mein PHP Script mir da sendet genau das selbe, was ich raus bekomme, wenn ich nach MCoder wstring via WideCharToMultiByte zu string konvertiere, sprich ich kann die Funktion die ich mir damals gebastelt habe hier auch wieder verwenden?
Also irgendwie verstehe ich deine Frage nicht.

MCoder hat dir damals demonstriert wie man unter Windows wstrings von "Unicode" (UTF-16) nach UTF-8 und zurück konvertiert. Jetzt hast du schon UTF-8 und möchtest nach wstring konvertieren...

Gruß
 
Zurück