Readfile() funktioniert seit Umstellung auf UNICODE nicht mehr
-
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 einTCHAR*
.
TCHAR
ist bei MBCSchar
und bei UNICODEwchar_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 einenwchar_t
String rein. Der dann vermutlich im restlichen Programm korrekt alswchar_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 vonTCHAR
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. VorReadFile
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 mitwchar_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 mitwchar_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.