InternetReadFile wchar_t Problem



  • 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:

    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.



  • InternetReadFileW



  • 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.



  • Schonmal vielen Dank für die Antworten.

    InternetReadFileW

    In meinen Projekteigeneschaften habe ich den Zeichensatz auf Unicode gestellt. Von daher ist es automatisch InternetReadFileW.

    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...



  • 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.



  • 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?



  • 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.



  • 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.



  • wird dein Problem nicht lösen, aber wieso forderst du response mit new an?



  • 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.


Anmelden zum Antworten