| Autor |
Nachricht |
cappend
Unregistrierter
|
cappend Unregistrierter
18:37:27 15.07.2012 Titel: |
InternetReadFile wchar_t Problem |
Zitieren |
Ich verusche mit InternetReadFile eine Website auszulesen. Doch sobald ich wchar_t statt char verwende, bekomme ich nur komische Zeichen zurück.
Hier der Auschnitt:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 | std::wstring rbuf;
wchar_t *response = new wchar_t[260];
DWORD iread = 0;
while(InternetReadFile(hOpenUrl, response, 260, &iread))
{
if(iread == 0)
break;
rbuf += response;
response[iread - 1] = '\0';
} | |
Den Teil mit InternetOpen und der anderen Vorarbeit habe ich weg gelassen, da es ja mit einem char * geht und die Funktionen keinen Fehler zurück geben. |
|
|
|
 |
foo0
Unregistrierter
|
foo0 Unregistrierter
22:02:17 15.07.2012 Titel: |
|
Zitieren |
|
 |
nwp3
Unregistrierter
|
nwp3 Unregistrierter
22:02:45 15.07.2012 Titel: |
|
Zitieren |
wchar_t ist quasi 16-bit Unicode. Das heißt es gibt 2 Byte pro Zeichen statt einem. Es erlaubt neben "normalen" Buchstaben auch chinesisch und ähnliches, was man mit chars nicht ausdrücken kann. Du kannst mbstowcs bzw wcstombs benutzen um die Darstellungsarten ineinander umzuwandeln. Wenn du aber einfach umcastest fehlinterpretiert er jeweils 2 chars als wchar_t und es kommt Blödsinn raus. |
|
|
|
 |
cappend
Unregistrierter
|
cappend Unregistrierter
01:47:34 16.07.2012 Titel: |
|
Zitieren |
Schonmal vielen Dank für die Antworten.
In meinen Projekteigeneschaften habe ich den Zeichensatz auf Unicode gestellt. Von daher ist es automatisch InternetReadFileW.
| Zitat: | | Du kannst mbstowcs bzw wcstombs benutzen um die Darstellungsarten ineinander umzuwandeln. Wenn du aber einfach umcastest fehlinterpretiert er jeweils 2 chars als wchar_t und es kommt Blödsinn raus. |
Das Problem ist, dass ich garnichts caste. Das wchar_t gebe ich sofort mit MessageBoxW aus. Wenn ich mein Projekt auf Multibyte umstelle und dann noch aus dem wchar_t * ein char * mache, dann „rbuf“ mit MessageBoxA ausgebe, dann ist alles richtig. Ich finde den Fehler ganz einfach nicht... |
|
|
|
 |
Belli
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.08.2009
Beiträge: 1773
|
Belli Mitglied
07:27:48 16.07.2012 Titel: |
|
Zitieren |
| cappend schrieb: |
In meinen Projekteigeneschaften habe ich den Zeichensatz auf Unicode gestellt. Von daher ist es automatisch InternetReadFileW. |
Da die Funktion überhaupt nicht mit Zeichen hantiert, vermute ich, dass es keine unterschiedlichen A / W - Versionen gibt.
Die Funktion schreibt die erhaltenen Daten ja einfach in einen Puffer auf den mit einem void - Pointer gezeigt wird.
Ich schätze mal, dass die Seite einfach char's liefert. Das ist dann natürlich unabhängig davon, ob Du die Daten in einen string oder in einen wstring packst - nur ein wstring kann damit halt nichts anfangen. |
|
|
|
 |
cappend
Unregistrierter
|
cappend Unregistrierter
15:20:42 16.07.2012 Titel: |
|
Zitieren |
| Zitat: | | nur ein wstring kann damit halt nichts anfangen. |
Die Frage ist wieso? Wenn ich das ganze aber in einem wstring speichern möchte, weil ich später noch mit diesem String weiter arbeiten muss mit Unicode Funktionen, soll ich dann einfach ein string zu wstring konvertieren? |
|
|
|
 |
Belli
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.08.2009
Beiträge: 1773
|
Belli Mitglied
15:55:03 16.07.2012 Titel: |
|
Zitieren |
Wieso? Wenn die Seite Dir char-codierte Informationen schickt, dann hast Du halt nur ein Byte für ein Zeichen, wchar aber will 2 Byte für ein Zeichen.
Und ja, wenn das so ist, dann musst Du entweder mit char / string arbeiten, oder eben zu wchar / wstring konvertieren. |
|
|
|
 |
nwp3
Unregistrierter
|
nwp3 Unregistrierter
15:58:33 16.07.2012 Titel: |
|
Zitieren |
So wie ich das verstanden habe gibt dir InternetReadFile weder einen char * noch einen wchar_t *. Es gibt dir den Inhalt der Datei/URL die du angibst und hat selbst keine Ahnung was dieser bedeutet. Es liegt also an dir den Inhalt zu interpretieren, je nachdem ob du eine .html, .txt, .png oder was auch immer lädst. |
|
|
|
 |
floorball
Mitglied
Benutzerprofil
Anmeldungsdatum: 18.04.2012
Beiträge: 55
|
floorball Mitglied
20:26:29 22.07.2012 Titel: |
|
Zitieren |
wird dein Problem nicht lösen, aber wieso forderst du response mit new an? |
|
|
|
 |
merano
Mitglied
Benutzerprofil
Anmeldungsdatum: 21.12.2006
Beiträge: 412
|
merano Mitglied
20:42:42 22.07.2012 Titel: |
|
Zitieren |
| floorball schrieb: | | wird dein Problem nicht lösen, aber wieso forderst du response mit new an? |
Und wenn schon dann dann müsste es wg. "Number of bytes to be read" später
260 * sizeof(wchar_t) heissen. Vermutlich wäre es aber besser einen
char* zu verwenden. |
|
|
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|