Das Problem ist, ich weiß ja nicht welche Zeichen kaputt sind. Bei dieser Datei schon, aber es könnte auch eine beliebig andere kaputte Datei geladen werden. Dort liegen wieder andere Kodierfehler vor. Also einfach Suchen und Ersetzen ist nicht.
Aber wenn ich so in die Quellen von TEncoding schaue dann wird für solche Zeichen tatsächlich nichts anderes gemacht als ein RAISE und fertig. Um das zu ändern müsste ich wohl ein komplett eigenes TEncoding schreiben, weil die Methode TEncoding.GetString (wo das RAISE passiert) nicht virtuell ist. Ich glaub da stehen Aufwand und Nutzen in keinem Verhältnis.
EDIT:
Ich bin mir gar nicht mehr sicher, ob es sich wirklich um eine UTF-16 codierte Datei handelt. Im TStreamReader.Create wird zwar ein TEncoding.Unicode übergeben, aber für das DetectBOM wiederum ein True. Damit wird das
Unicode-Encoding lediglich zum Fallback, wenn kein BOM gefunden wird.
Genau so ist das auch beabsichtigt. Ich wollte damit erreichen, dass die Preamble (BOM ist ja eigentlich nur ein Teil dessen) ausgewertet wird. Erst wenn das komplett vor die Wand geht, gebe ich
Unicode fest vor. Bei der besagten Datei kann aber auch Notepad++ die kaputten Zeichen nicht retten, egal wie man an der Kodierung dreht. Insofern betrachte ich die Preamble als korrekt und den Inhalt als defekt. Die Datei kommt mit einer
Unicode-Preamble. Aber auch anders herum, wenn ich hardcoded UTF8 als Reader-Encoding vorgebe und die Preamble ignoriere, laufe ich in genau die selbe
Exception.