Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: WinAPI ::  InternetReadFile wchar_t Problem     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
cappend
Unregistrierter




Beitrag 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




Beitrag foo0 Unregistrierter 22:02:17 15.07.2012   Titel:              Zitieren

InternetReadFileW
nwp3
Unregistrierter




Beitrag 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




Beitrag cappend Unregistrierter 01:47:34 16.07.2012   Titel:              Zitieren

Schonmal vielen Dank für die Antworten.

Zitat:
InternetReadFileW

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: 1772
Beitrag 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




Beitrag 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: 1772
Beitrag 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




Beitrag 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
Beitrag 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: 408
Beitrag 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.
c++.de :: WinAPI ::  InternetReadFile wchar_t Problem   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.