Autor Beitrag
hRb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 234
Erhaltene Danke: 12



BeitragVerfasst: Fr 05.03.21 13:40 
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

ausblenden 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
    // Read the file into buffer.
    SetLength(LBuffer, LFileStream.Size);
    LFileStream.ReadBuffer(Pointer(LBuffer)^, Length(LBuffer));
    // Get data encoding of read data.
    LOffset := TEncoding.GetBufferEncoding(LBuffer, LEncoding);
  finally
    LFileStream.Free;
  end;

im weiteren Verlauf des Beispiels wird eine Combobox ausgewertet, nach der Encodiert werden kann

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
  // Process various types.
  case ComboIndex of

    // AnsiToUtf8
    0:
    begin
      // Identify the encoding and convert buffer to Ansi.
      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 user profile iconTh69: Topic aus Grafische Benutzeroberflächen (VCL & FireMonkey) verschoben am Fr 05.03.2021 um 13:42
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 234
Erhaltene Danke: 12



BeitragVerfasst: Mo 15.03.21 18:01 
Hallo zusammen,
schade - nach 10 Tagen keine einzige Reaktion auf meine Frage. Auch kein Hinweis 1000-fach gestellte Fragen nicht zu wiederholen (habe nämlich vorab intensiv gesucht) . So muss ich annehmen, dass 15 Jahe nach Einführung von Uni-String, es immer noch keinen Funktionsaufruf gibt, der mir den BOM einer Datei auswertert und einen Encoding-Index liefert. Also bleibt's bei eigener Auswertung?
Werde noch einige Tage warten.
hRb