Hallo,
ich möchte einen Stream auswerten, bei dem die Codierung zunächst nicht bekannt ist. Habe in der Hilfe ein Beispiel gefunden in UnicodeConversion (Delphi) From RAD Studio Code Examples
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| procedure TForm1.Button1Click(Sender: TObject); var LBuffer: TBytes; LByteOrderMark: TBytes; LFileStream: TFileStream; LOffset: Integer; LEncoding, DestEncoding: TEncoding; ComboIndex: Integer; ByteString: RawByteString; FileText: string; ucs4Text: UCS4String; wideStringText: WideString; utf8Text: UTF8String; L: Cardinal;
begin LEncoding:= nil; ComboIndex := ComboBox1.ItemIndex; LFileStream := TFileStream.Create(Edit1.Text, fmOpenRead); try SetLength(LBuffer, LFileStream.Size); LFileStream.ReadBuffer(Pointer(LBuffer)^, Length(LBuffer)); LOffset := TEncoding.GetBufferEncoding(LBuffer, LEncoding); finally LFileStream.Free; end; |
im weiteren Verlauf des Beispiels wird eine Combobox ausgewertet, nach der Encodiert werden kann
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| case ComboIndex of
0: begin DestEncoding := TEncoding.ASCII; LBuffer := LEncoding.Convert(LEncoding, DestEncoding, LBuffer, LOffset, Length(LBuffer) - LOffset); LOffset := TEncoding.GetBufferEncoding(LBuffer, DestEncoding); FileText := DestEncoding.GetString(LBuffer, LOffset, Length(LBuffer) - LOffset); ByteString := AnsiToUtf8(FileText); ShowMessage(UTF8ToString(ByteString)); hier folgen weitere Case-Verzweigungen |
im Textopen-Dialog kann ein Anwender wählen, wie eine Datei encodiert werden soll. Finde dies allerdings nicht besonders sinnvoll (Anwender soll entscheiden). Gibt es zur automatischen Auswertung der Codierung eine fertige (schlanke) Funktion im Sinne ReadBOM, für meine bisherige Lösung.
- Prüfen ob Datei größer 3 Byte
- dann 3 Byte Lesen und prüfen ob bekannter BOM erlennbar
- daraus DestEncoding festlegen
- Nun Datei einlesen wie in der Case-Anweisung
Meine Frage: gibt es inzwischen eine fertige Funktion, die mir das Ergebnis Offset und Encoding-Typ zurückliefert, also im Sinne
DestEncoding:= ReadBOM(Filename) ?
Moderiert von Th69: Topic aus Grafische Benutzeroberflächen (VCL & FireMonkey) verschoben am Fr 05.03.2021 um 13:42