AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi In HTML-Dateien Umlaute / Sonderzeichen ersetzen
Thema durchsuchen
Ansicht
Themen-Optionen

In HTML-Dateien Umlaute / Sonderzeichen ersetzen

Ein Thema von ringli · begonnen am 26. Okt 2008 · letzter Beitrag vom 3. Nov 2008
Antwort Antwort
Seite 1 von 2  1 2      
ringli

Registriert seit: 7. Okt 2004
504 Beiträge
 
Delphi 11 Alexandria
 
#1

In HTML-Dateien Umlaute / Sonderzeichen ersetzen

  Alt 26. Okt 2008, 13:23
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.
  Mit Zitat antworten Zitat
aladin60

Registriert seit: 12. Mär 2008
Ort: Sachsen-Anhalt
45 Beiträge
 
Delphi 2006 Personal
 
#2

Re: In HTML-Dateien Umlaute / Sonderzeichen ersetzen

  Alt 26. Okt 2008, 13:52
Dateien nacheinander jeweils in eine TStringList mit LoadFromFile einlesen, zeilenweise durchlaufen zum ersetzen z.B. mit replace, dann Stringliste wieder mit SaveToFile speichern...

Bernd.
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
504 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: In HTML-Dateien Umlaute / Sonderzeichen ersetzen

  Alt 26. Okt 2008, 13:59
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.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

Re: In HTML-Dateien Umlaute / Sonderzeichen ersetzen

  Alt 27. Okt 2008, 09:01
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).
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
504 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: In HTML-Dateien Umlaute / Sonderzeichen ersetzen

  Alt 27. Okt 2008, 18:00
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.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

Re: In HTML-Dateien Umlaute / Sonderzeichen ersetzen

  Alt 28. Okt 2008, 08:42
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.
  Mit Zitat antworten Zitat
Benutzerbild von Xong
Xong

Registriert seit: 9. Jan 2008
186 Beiträge
 
Delphi 2006 Professional
 
#7

Re: In HTML-Dateien Umlaute / Sonderzeichen ersetzen

  Alt 28. Okt 2008, 08:58
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?
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
504 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: In HTML-Dateien Umlaute / Sonderzeichen ersetzen

  Alt 31. Okt 2008, 05:51
@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.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

Re: In HTML-Dateien Umlaute / Sonderzeichen ersetzen

  Alt 31. Okt 2008, 08:36
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;');
...
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
504 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: In HTML-Dateien Umlaute / Sonderzeichen ersetzen

  Alt 31. Okt 2008, 20:06
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:48 Uhr.
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