[Gelöst] Memo zeigt String mit Sonderzeichen nicht an

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

[Gelöst] Memo zeigt String mit Sonderzeichen nicht an

Beitrag von Komoluna »

Hi,

ich bin auf ein seltsames Problem gestoßen:
Eine per GZip kompremierte Datei habe ich dekompremiert und wollte sie mir in einem Memofeld anzeigen lassen (zu debugzwecken).
Das Memo blieb jedoch leer.
Dann habe ich den Inhalt des dekompremierten Streams in eine Datei gespeichert(siehe Anhang) und versucht den Inhalt der Datei ins Memo zu laden. Selbes Ergebnis.
Wenn ich die Datei aber mit einem Editor(Windows-notepad/Notepad++/Sublime Text) sehe ich den Inhalt der Datei. Bisher war ich davon ausgegangen mit dem Memo quasi das Windows Notepad in "Händen"(dem Cursor) zu halten.

(Per Konsolenausgabe(Writeln) gehts auch)

Weiß irgendwer woran das liegt?

MFG

Komoluna

P.S.: Falls sich wer über den Inhalt der Datei wundert: Das ist die level.dat aus einer Minecraft Spielwelt.
Dateianhänge
out.txt
(2.13 KiB) 72-mal heruntergeladen
Zuletzt geändert von Komoluna am So 13. Sep 2015, 15:42, insgesamt 1-mal geändert.
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Memo zeigt String mit Sonderzeichen nicht an

Beitrag von Michl »

Es handelt sich dabei um gar keine Textdatei.

Strings sind, obwohl sie ein Längenbyte besitzen, Null-terminiert: Bsp.:

Code: Alles auswählen

procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo1.Lines.Text := 'Hallo '#0'Hallo';
end; 
Wenn gleich am Anfang in der Datei ein Byte mit einer Null steht (wie bei dir), ist es nur logisch, dass kein Inhalt angezeigt wird.

Wenn es dir nur zur optischen Betrachtung geht kannst du sowas (oder ähnliches) machen:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  FS: TFileStream;
  MS: TMemoryStream;
  i: Integer;
  b: Byte;
begin
  FS := TFileStream.Create('out.txt', fmOpenRead);
  MS := TMemoryStream.Create;
  try
    FS.Position := 0;
    for i := 0 to FS.Size - 1 do begin
      b := FS.ReadByte;
      if b = 0 then
        MS.WriteByte(32)
      else
        MS.WriteByte(b);
    end;
    MS.Position := 0;
    Memo1.Lines.LoadFromStream(MS);
  finally
    MS.Free;
    FS.Free;
  end;
end; 

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Memo zeigt String mit Sonderzeichen nicht an

Beitrag von theo »

Das ist einfach keine saubere Textdatei.
Ich habe sie unter KDE mit KWrite geöffnet.
Die Meldung von KWrite:

Code: Alles auswählen

Die Datei out.txt wurde als UTF-8 kodiert geöffnet, enthält aber ungültige Zeichen.
Der Zugriff ist auf Nur-Lesen gesetzt worden, da ein Speichern den Inhalt der Datei zerstören könnte.
Öffnen Sie die Datei erneut mit der korrekten Kodierung oder deaktivieren Sie den Nur-Lesen-Modus über das Menü.
EDIT: Michl war schneller.

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Memo zeigt String mit Sonderzeichen nicht an

Beitrag von Komoluna »

Ok, das wusste ich noch garnicht.
Dann ist also der Windows Editor unsauber programmiert oder wie?

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Memo zeigt String mit Sonderzeichen nicht an

Beitrag von theo »

Komoluna hat geschrieben: Dann ist also der Windows Editor unsauber programmiert oder wie?
Ob man das so sagen kann, könnte man diskutieren.
Mir gefällt die deutliche Warnung von KWrite jedenfalls besser.

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Memo zeigt String mit Sonderzeichen nicht an

Beitrag von theo »

Man kann das für UTF-8 übrigens auch überprüfen lassen:

Code: Alles auswählen

var
  sl: TStringList;
begin
  sl := TStringList.Create;
  sl.LoadFromFile('/home/theo/out.txt');
  if FindInvalidUTF8Character(PChar(sl.Text), Length(sl.Text)) = -1 then
    Memo1.Text := sl.Text
  else
    MessageDlg('Kein UTF-8 String', mtWarning, [mbCancel], 0);
  sl.Free;
end;     

Antworten