Readfile() funktioniert seit Umstellung auf UNICODE nicht mehr



  • Hallo zusammen,

    ich habe mein Projekt nun endlich mal auf Unicode umgestellt.
    Problem ist jetzt aber das ich eine Datei mittels ReadFile() nicht mehr lesen kann.
    Ich vermute es liegt an dem wchar Datentyp und das ReadFile() nur Bytes liest:

    int Create_MIME_Content(LPTSTR sFile,LPTSTR sBuffer) {
    	HANDLE hFile;
    	long iFileSize;
    	int err;
    	DWORD dwReadBytes;
    
    	iFileSize = get_file_size(sFile) + 1;
    
    	hFile = CreateFile(sFile,FILE_GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_NORMAL, NULL);
    
    	if (hFile == INVALID_HANDLE_VALUE) 
    		return GetLastError();
    
    	err = ReadFile(hFile, sBuffer, iFileSize, &dwReadBytes, NULL);
    
    	if(err == 0) 
    		return GetLastError(); 
    
    	CloseHandle(hFile);
    	return 0;
    }
    

    Jetzt die alles entscheidende Frage wie kann ich dieses Problem am besten lösen ?
    Stelle ich das Projekt von UNICODE wieder auf MBCS um dann läuft alles ohne Probleme.
    Hintergrund ist, ich möchte eine Datei (Textdatei ANSI oder UTF8) auslesen und anschließend auf einen Webserver hochladen.

    Freue mich auf eure Antworten.

    Grüße



  • JamesB0nd007 schrieb:

    [...] nicht mehr lesen kann.

    Geht das auch etwas konkreter?



  • Caligulaminus schrieb:

    JamesB0nd007 schrieb:

    [...] nicht mehr lesen kann.

    Geht das auch etwas konkreter?

    Ich bekomme chinesische Zeichen angezeigt.
    Die Datei landet nicht auf dem Webserver!



  • Was hast du denn erwartet? Dass ReadFile magisch errät, dass du eigentlich UTF-8 in UTF-16 (WCHAR) konvertieren willst? Du musst dich schon entscheiden, ob der Puffer für den Dateiinhalt Text ist oder ein Blob.



  • TyRoXx schrieb:

    Was hast du denn erwartet? Dass ReadFile magisch errät, dass du eigentlich UTF-8 in UTF-16 (WCHAR) konvertieren willst? Du musst dich schon entscheiden, ob der Puffer für den Dateiinhalt Text ist oder ein Blob.

    Also so ganz hilft mir das jetzt nicht wirklich weiter ... aber was ich dann jetzt mal versuchen würde, der Buffer für Readfile wird einfach zu einem char anschließend konvertiere ich zu wchar um intern mit dem Text zu arbeiten. Wenn ich die Datei dann auf den Webserver hochladen will konvertiere ich meine Variablen mittels WideCharToMultiByte() zu UTF8 und bereite das Request vor.

    Hoffe mal auf Antworten mit denen ich mehr oder weniger was anfangen kann, danke.
    Wie gesagt was Unicode angeht bin ich noch nicht wirklich fit, habe die ganze Zeit bewusst drauf verzichtet.



  • Erst mal wäre die Frage wichtig: was ist das für eine Datei, die du öffnest? Bist du dir über die Codierung 100% sicher oder kann der Anwender alles mögliche auswählen?

    In dem Fall solltest du als erstes den Byte Order Mark checken. Ist der vorhanden, sagt er schon mal viel aus: UTF-8, UTF-16,... Fehlt er, kann immer noch eine ANSI-Codierung vorliegen - oder auch eine ausführbare Datei oder schlicht Nonsens.

    Hast du eine Unicode-Datei, musst du als nächstes die Byte-Reihenfolge prüfen (Stichworte: Big-Endian, Little-Endian) und ggf. korrigieren. Erst dann weißt du mit Sicherheit, was du tun musst, um zum UTF-8 zu kommen.

    Hast du eine ANSI-Codierung, bleibt dann noch die Frage nach der Codepage. Entweder unterstellst du die Default-Page des Betriebssystems oder du musst den Anwender fragen. Und dann erst kannst du in UTF-8 umwandeln.

    Und alles andere? - nun ja. Fehlermeldung wär sicher das sinnvollste.



  • Probier mal CreateFileW statt CreateFile. 🙂



  • Du liest den Inhalt der Datei direkt nach
    LPTSTR sBuffer
    rein.

    LPTSTR ist ein TCHAR* .
    TCHAR ist bei MBCS char und bei UNICODE wchar_t .

    Wenn es mit MBCS funktioniert hat, dann ist dein File auch MBCS (also es stehen MBCS drinnen).
    Demendsprechend kopierst du jetzt MBCS-Daten in einen wchar_t String rein. Der dann vermutlich im restlichen Programm korrekt als wchar_t String weiterverarbeitet wird.

    Das kann nicht funktionieren.

    Was du machen kannst, ist die Daten aus dem File erstmal in einen Zwischenpuffer zu kopieren, und dann aus diesem Zwischenpuffer raus von MBCS nach UTF-16 zu konvertieren.
    (Welches Encoding auf der MBCS-Seite korrekt ist weiss ich natürlich nicht -- hängt ja davon ab was in deinen Dateien drinnen steht.)



  • JamesB0nd007 schrieb:

    Hoffe mal auf Antworten mit denen ich mehr oder weniger was anfangen kann, danke.
    Wie gesagt was Unicode angeht bin ich noch nicht wirklich fit, habe die ganze Zeit bewusst drauf verzichtet.

    Was soll das überhaupt mit den TCHAR s? Das ist ein völlig überholtes Konzept, das für Kompatibilität mit Windows 98 oder so existierte. Da du nicht weißt, was Unicode ist, solltest du erst recht die Finger von TCHAR lassen.

    FSK schrieb:

    Erst mal wäre die Frage wichtig: was ist das für eine Datei, die du öffnest? Bist du dir über die Codierung 100% sicher oder kann der Anwender alles mögliche auswählen?

    In einer Datei kann immer alles Mögliche drin sein. Hier ist es - wie der Fragesteller geschrieben hat - UTF-8.

    Andromeda schrieb:

    Probier mal CreateFileW statt CreateFile. 🙂

    Erstens falsch und zweitens hat das nichts mit dem Problem zu tun.

    JamesB0nd007 schrieb:

    ich habe mein Projekt nun endlich mal auf Unicode umgestellt.

    Nein, hast du nicht. Du hast auf TCHAR umgestellt. Warum auch immer. Unicode macht man mit UTF-8 / char .

    Was machst du überhaupt mit dem Inhalt der Datei? Also konkret jetzt.



  • TyRoXx schrieb:

    Unicode macht man mit UTF-8 / char .

    Unter Windows nicht wirklich.
    (EDIT: Also man kann natürlich, und man kann auch darüber diskutieren ob man vielleicht sollte, aber üblich ist es nicht. /EDIT)



  • TyRoXx schrieb:

    Andromeda schrieb:

    Probier mal CreateFileW statt CreateFile. 🙂

    Erstens falsch und zweitens hat das nichts mit dem Problem zu tun.

    Das wissen wir nicht. Dazu ist die Fehlerbeschreibung zu ungenau.



  • hustbaer schrieb:

    TyRoXx schrieb:

    Unicode macht man mit UTF-8 / char .

    Unter Windows nicht wirklich.
    (EDIT: Also man kann natürlich, und man kann auch darüber diskutieren ob man vielleicht sollte, aber üblich ist es nicht. /EDIT)

    Was heißt "unter Windows"? Windows-spezifischer Code arbeitet natürlich mit wchar_t , aber portable Anteile benutzen UTF-8, wenn es nicht einen sehr guten Grund dagegen gibt. Der Grund wäre, dass der Profiler in einem performance-kritischen Teil sagt, dass viel Zeit für Umkodieren draufgeht. Bei Optimierung hören so generelle Ratschläge wie meiner sowieso auf.

    Andromeda schrieb:

    Das wissen wir nicht. Dazu ist die Fehlerbeschreibung zu ungenau.

    Da werden irgendwelche Bytes in ein wchar_t -Array geschrieben und das ganze dann als UTF-16 (oder wie auch immer Microsoft das nennt) interpretiert. Vor ReadFile ist noch alles in Ordnung (jetzt mal abgesehen vom Buffer Overflow).



  • TyRoXx schrieb:

    Da werden irgendwelche Bytes in ein wchar_t -Array geschrieben ...

    Woher willst du das wissen?
    Vielleicht waren diese Bytes schon vorher da.



  • Andromeda schrieb:

    TyRoXx schrieb:

    Da werden irgendwelche Bytes in ein wchar_t -Array geschrieben ...

    Woher willst du das wissen?
    Vielleicht waren diese Bytes schon vorher da.

    Weil es mit TCHAR = char funktioniert und mit wchar_t plötzlich nicht. Wenn du eine plausiblere Erklärung hast, bitte her damit.



  • TyRoXx schrieb:

    Andromeda schrieb:

    TyRoXx schrieb:

    Da werden irgendwelche Bytes in ein wchar_t -Array geschrieben ...

    Woher willst du das wissen?
    Vielleicht waren diese Bytes schon vorher da.

    Weil es mit TCHAR = char funktioniert und mit wchar_t plötzlich nicht. Wenn du eine plausiblere Erklärung hast, bitte her damit.

    CreateFile und ReadFile bekommen falschen Input. Das bedeutet jedoch nicht zwangsläufig, dass sie fehlschlagen. Vor allem dann nicht, wenn nur ein bestimmter Wert als Fehler interpretiert wird, während alle anderen als korrekt angesehen werden. 😞


Anmelden zum Antworten