Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi In HTML-Dateien Umlaute / Sonderzeichen ersetzen (https://www.delphipraxis.net/123038-html-dateien-umlaute-sonderzeichen-ersetzen.html)

ringli 26. Okt 2008 13:23


In HTML-Dateien Umlaute / Sonderzeichen ersetzen
 
Wie kann ich in vorhandenen HTML-Dateien automatisch Umlaute bzw. Sonderzeichen durch den dazugehörigen Code (z.B. aus ä wird ä oder aus einem Leerzeichen wird usw.) ersetzen lassen? Klar könnte ich jede Datei einzeln öffnen und über "Suchen und Ersetzen" die einzelnen Umlaute ersetzen, aber ich würde das lieber so machen das ich die Dateien markiere und per Drag & Drop in ein Programmfenster ziehe und dort automatisch nacheinander abarbeiten lasse.

Ein Ansatz wäre das über StringReplace zu lösen, was aber nicht so gut sein dürfte da dann unter Umständen auch Links oder ähnliches ersetzt werden die eigentlich nicht ersetzt werden dürfen.

Ein zweiter Ansatz sind vermutlich RegEx-Ausdrücke von denen ich leider null Ahnung habe.

Der dritte Ansatz wäre das über einen HTML-Parser zu machen, jedoch habe ich bisher keinen guten kostenlosen oder zumindest günstigen HTML-Parser gefunden. Vielleicht kennt ja einer von euch einen guten?

Ansonsten wäre ich über Tips dankbar wie man das Problem sonst noch angehen könnte. :)

aladin60 26. Okt 2008 13:52

Re: In HTML-Dateien Umlaute / Sonderzeichen ersetzen
 
Dateien nacheinander jeweils in eine TStringList mit LoadFromFile einlesen, zeilenweise durchlaufen zum ersetzen z.B. mit replace, dann Stringliste wieder mit SaveToFile speichern...

Bernd.

ringli 26. Okt 2008 13:59

Re: In HTML-Dateien Umlaute / Sonderzeichen ersetzen
 
Zitat:

Zitat von aladin60
Dateien nacheinander jeweils in eine TStringList mit LoadFromFile einlesen, zeilenweise durchlaufen zum ersetzen z.B. mit replace, dann Stringliste wieder mit SaveToFile speichern...

Bernd.

Hmm... aber auch da besteht doch dann wieder die Gefahr das Elemente ersetzt werden die nicht ersetzt werden dürfen oder irre ich mich da? Das ist ja im Grunde das was ich mit meinem ersten Ansatz meinte.

nahpets 27. Okt 2008 09:01

Re: In HTML-Dateien Umlaute / Sonderzeichen ersetzen
 
Hallo,

auf die Schnelle:

Lese Dir die Eingabedateien in einen Eingabe-String ein.
Mache Dir einen Ausgabe-String für die Ausgabedateien.
Gehe den String von 1 bis length(String) durch und frage mit Case Eingabe-String[i] of die einzelnen Zeichen ab.
Stößt Du auf ein zu ersetzendes Zeichen so schreibe in den Ausgabe-String die Ersetzung (ä -> ä u.s.w.) andernfalls schreibe das unveränderte Zeichen in den Ausgabe-String.
Hier könntest Du Stringlisten und deren Attribut Text verwenden oder das Ganze über zwei Filestreams realisieren (was sicherlich eleganter und schneller ist).

ringli 27. Okt 2008 18:00

Re: In HTML-Dateien Umlaute / Sonderzeichen ersetzen
 
Dann bleibt nach wie vor das Problem das ich z.B. Links auch übersetze. Bei denen wäre es schlecht wenn z.B. aus
Code:
www.müller.de
auf einmal ein
Code:
www.m&uumll;er.de
wird. Ich werde also vermutlich nicht drumherum kommen mich mit irgendeinem HTML-Parser anfreunden zu müssen.

nahpets 28. Okt 2008 08:42

Re: In HTML-Dateien Umlaute / Sonderzeichen ersetzen
 
Hallo,

wenn Du meinem Vorschlag folgst und ihn ein bisserl erweiterst, könntest Du hergehen und immer, wenn Du auf ein < triffst, solange keine "Übersetzung" vornehmen, bis Du auf ein > triffst. Damit sparst Du Dir dann alles in den HTML-Tags aus. Das dürfte eigentlich kein großes Problem sein, da reicht ein boolscher Schalter.

Xong 28. Okt 2008 08:58

Re: In HTML-Dateien Umlaute / Sonderzeichen ersetzen
 
Hilfe hast du ja nun schon bekommen. Aber ich möchte das Thema von einer anderen Seite beleuchten.

Warum möchtest du die Umlaute ersetzen?
Es ist extrem unvorteilhaft das zu tun. Normalerweise sollten die HTML-Dateien in einer ISO-8859-1 vorliegen. Diese Kodierung enthält auch deutsche Umlaute. Wieso also möchtest du die Sonderzeichen in entsprechende HTML-Entities übersetzen?

Außerdem kann ich nur empfehlen, HTML-Seiten und -Dateien bei einer Neuerstellung mit UTF-8 zu kodieren. Und selbst bei fertigen Projekten könnte sich eine Umstellung auf UTF-8 durchaus lohnen, da nur so XHTML-1.0-kompatible Seiten erstellt werden können.

Wenn du Interesse an weiteren Ausführungen hast, dann kannst du dich gerne melden. =)

LG,
Xong

PS: In diesem Zusammenhang könnte dich der folgende Thread interessieren: Websiteumstellung auf UTF-8, wie geht's?

ringli 31. Okt 2008 05:51

Re: In HTML-Dateien Umlaute / Sonderzeichen ersetzen
 
@nahpets:
Danke, deine Idee ist ja genial. :) Habe das testweise mal so gelöst:
Delphi-Quellcode:
var
  I            : Integer;
  INPUT_FILE   : TStringList;
  OUTPUT_FILE  : TStringList;
  LengthOfFile : Int64;
  OneCharOfFile : Byte;
  HtmlTag      : Boolean;
begin
  HtmlTag := False;

  INPUT_FILE := TStringList.Create;
  INPUT_FILE.LoadFromFile('D:\Test\index.html');

  OUTPUT_FILE := TStringList.Create;
  OUTPUT_FILE.LineBreak := '';

  LengthOfFile := Length(INPUT_FILE.Text);

  for i := 0 to LengthOfFile - 1 do
    begin
      OneCharOfFile := Ord(INPUT_FILE.Text[i + 1]);

      case OneCharOfFile of
        // <
        60 : HtmlTag := True;
        // >
        62 : HtmlTag := False;
      end;

      if not HtmlTag then
        begin
          case OneCharOfFile of
            // ä
            228 : OUTPUT_FILE.Append('&auml;');
            // Ä
            196 : OUTPUT_FILE.Append('&Auml;');
            // ö
            246 : OUTPUT_FILE.Append('&ouml;');
            // Ö
            214 : OUTPUT_FILE.Append('&Ouml;');
            // ü
            252 : OUTPUT_FILE.Append('&uuml;');
            // Ü
            220 : OUTPUT_FILE.Append('&Uuml;');
          else
            OUTPUT_FILE.Append(INPUT_FILE.Text[i + 1]);
          end;
        end
      else
        begin
          OUTPUT_FILE.Append(INPUT_FILE.Text[i + 1]);
        end;
    end;

  OUTPUT_FILE.SaveToFile('D:\Test\index_neu.html');

  FreeAndNil(INPUT_FILE);
  FreeAndNil(OUTPUT_FILE);
end;
Vielleicht hat ja jemand noch Ideen wie man das Ganze optimieren kann.

@Xong:
Ich selber brauche das nicht da ich mit Webseitenerstellung nichts mache. Ein Bekannter hatte mich gefragt ob ich ihm so was programmieren könnte. Für mich ist das also eher eine Machbarkeitsstudie. Aber danke für dein Angebot. Vielleicht komme ich ja doch mal darauf zurück.

nahpets 31. Okt 2008 08:36

Re: In HTML-Dateien Umlaute / Sonderzeichen ersetzen
 
Hallo,

versuch's mal mit Filestreams, dürfte (vor allem bei größeren Dateien) schneller sein und die Änderungen sind marginal.
Für das zu "bearbeitende" Zeichen nimmst Du Byte, das geht auch mit Char, dann sparst Du die "Konvertierung".

Delphi-Quellcode:
Var
  OneCharOfFile : Char;

begin
...
  case OneCharOfFile of
    // <
    #60 : HtmlTag := True;
    // >
    #62 : HtmlTag := False;
  end;
...
end;
Der weitere Teil könnte dann in der Form sein:
Delphi-Quellcode:
case OneCharOfFile of
  'ä' : OUTPUT_FILE.Append('&auml;');
  // #228 : OUTPUT_FILE.Append('&auml;');
  'Ä' : OUTPUT_FILE.Append('&Auml;');
  // #196 : OUTPUT_FILE.Append('&Auml;');
...

ringli 31. Okt 2008 20:06

Re: In HTML-Dateien Umlaute / Sonderzeichen ersetzen
 
So, jetzt das Ganze mal mit FileStreams:
Delphi-Quellcode:
procedure AppendString(FS : TFileStream; StrReplace : String);
var
  I : Integer;
begin
  for I := 0 to Length(StrReplace) - 1 do
    begin
      FS.Write(StrReplace[i + 1], 1);
    end;
end;

procedure TfrmMain.btnConvertClick(Sender: TObject);
var
  I            : Integer;
  OneCharOfFile : Char;
  INPUT_FILE   : TFileStream;
  OUTPUT_FILE  : TFileStream;
  HtmlTag      : Boolean;
begin
  HtmlTag := False;

  INPUT_FILE := TFileStream.Create('D:\Test\index.html', fmOpenRead);
  OUTPUT_FILE := TFileStream.Create('D:\Test\index_neu.html', fmCreate);

  for I := 0 to INPUT_FILE.Size - 1 do
    begin
      INPUT_FILE.Position := I;
      INPUT_FILE.Read(OneCharOfFile, 1);

      case OneCharOfFile of
        // <
        '<' : HtmlTag := True;
        // >
        '>' : HtmlTag := False;
      end;

      if not HtmlTag then
        begin
          case OneCharOfFile of
            // ä
            'ä' : AppendString(OUTPUT_FILE, '&auml;');
            // Ä
            'Ä' : AppendString(OUTPUT_FILE, '&Auml;');
            // ö
            'ö' : AppendString(OUTPUT_FILE, '&ouml;');
            // Ö
            'Ö' : AppendString(OUTPUT_FILE, '&Ouml;');
            // ü
            'ü' : AppendString(OUTPUT_FILE, '&uuml;');
            // Ü
            'Ü' : AppendString(OUTPUT_FILE, '&Uuml;');
          else
            AppendString(OUTPUT_FILE, OneCharOfFile);
          end;
        end
      else
        begin
          AppendString(OUTPUT_FILE, OneCharOfFile);
        end;
    end;

  FreeAndNil(INPUT_FILE);
  FreeAndNil(OUTPUT_FILE);
end;
Gibt es da jetzt noch Möglichkeiten den Code zu optimieren?


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:42 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz