[gelöst] HTML Entitäten zu UTF8

Alle Fragen zur Netzwerkkommunikation
Antworten
Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

[gelöst] HTML Entitäten zu UTF8

Beitrag von Michl »

Hallo allerseits,

gibt es eine einfache Möglichkeit HTML-Entitäten (Siehe hier: Name in HTML -> Zeichen) in UTF8 umzuformen (fertige Lib/Komponente)?!

Die Möglichkeit, alle in Frage kommenden Entitäten in einer selbstgebauten Funktion herauszusuchen und entsprechend zu ersetzen, wollt ich mir gern ersparen :wink:
Zuletzt geändert von Michl am Fr 16. Aug 2013, 02:00, insgesamt 1-mal geändert.

Code: Alles auswählen

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

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: HTML Entitäten zu UTF8

Beitrag von Socke »

Schau dir mal die Unit HTMLDefs an. Mit der Funktion ResolveHTMLEntityReference() erhältst du zwar einen WideChar, aber der Rest sollte kein Problem darstellen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: HTML Entitäten zu UTF8

Beitrag von Michl »

Bist´n Schatz! So einfach gehts, wenn man weiss, wo man suchen muss!!! Danke! :D :D :D

Habs jetzt mal auf die Schnelle zusammengebastelt und in den ersten Tests siehts gut aus (und falls es noch jemand mal brauchen könnt?!):

Code: Alles auswählen

procedure HtmlToStr(var Str:TStringList);
var
  x,y,z:integer;
  s:string;
  wc:widechar;
begin
  for x:=0 to Str.Count-1 do
    if pos('&',Str.Strings[x])>0 then begin
      s:=Str.Strings[x];
      y:=pos('&',s);
      z:=posex(';',s,y);
      while (y>0) do begin
        if (z>y) then
          if ResolveHTMLEntityReference(copy(s,y+1,z-y-1),wc) then
            s:=Stringreplace(s,copy(s,y,z-y+1),UTF8Encode(WideCharLenToString(@wc,1)),[rfReplaceAll]);
        inc(y);
        y:=posex('&',s,y);
        z:=posex(';',s,y);
      end;
      Str.Strings[x]:=s;
    end;
end;
Getestet unter Lazarus 1.0.10 FPC 2.6.2

Code: Alles auswählen

procedure HtmlToStr(var Str:TStringList);
var
  x,y,z:integer;
  s:string;
  wc:widechar;
begin
  for x:=0 to Str.Count-1 do
    if pos('&',Str.Strings[x])>0 then begin
      s:=UTF8toAnsi(Str.Strings[x]);
      y:=pos('&',s);
      z:=posex(';',s,y);
      while (y>0) do begin
        if (z>y) then
          if ResolveHTMLEntityReference(widestring(copy(s,y+1,z-y-1)),wc) then
            s:=Stringreplace(s,copy(s,y,z-y+1),UTF8Encode(wc),[rfReplaceAll]);
        inc(y);
        y:=posex('&',s,y);
        z:=posex(';',s,y);
      end;
      Str.Strings[x]:=UTF8Encode(s);
    end;
end;
Getestet unter Lazarus 1.1 FPC 2.7.1
Zuletzt geändert von Michl am Mo 19. Aug 2013, 22:17, insgesamt 3-mal geändert.

Code: Alles auswählen

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

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: [gelöst] HTML Entitäten zu UTF8

Beitrag von mschnell »

Ich kanns ja nicht lassen :twisted:

Wenn FPC einmal eine perfekte (also deutlich bessere als Embarcaderos) Implementierung von "New Strings" hat, würde man die HTML-Information inklusive Entitäten in einen String kopieren, diesem den Type "HTML basierend auf Grund-Code xyz" geben (bzw. würde man sie sowieso immer in diesem String Typ halten)und dann würde eine Zuordnung dieses Strings auf einem mit dem gewünschten festen Ziel-Typ (z.B.UTF8 oder UTF16) automatisch die entsprechende Umcodierung (normaler Text und Entities) vornehmen.

der obige Code könnte dann auf

Code: Alles auswählen

   MyUTF8String := MyHTMLString;

verkürzt werden

Das ist natürlich nur ein Traum, aber - wie in der englischen Mailing-Liste bereits diskutiert - im Prinzip möglich.

-Michael

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

Re: [gelöst] HTML Entitäten zu UTF8

Beitrag von theo »

mschnell hat geschrieben:Ich kanns ja nicht lassen :twisted:

Probier's doch einfach mal.

mschnell hat geschrieben:

Code: Alles auswählen

   MyUTF8String := MyHTMLString;



Ich möchte diesen alten Zopf "HTML-Entitäten" bitte nicht in einem FPC String mitschleppen. Das ist völliger Unsinn.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: [gelöst] HTML Entitäten zu UTF8

Beitrag von mschnell »

Was die Leute permanent irgendwo verwenden ist definitionsgemäß kein "Alter Zopf" (auch wenn mir ebenfalls der Sinn dieser merkwürdigen Codierung-Methodik völlig schleierhaft ist).

-Michael

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

Re: [gelöst] HTML Entitäten zu UTF8

Beitrag von Michl »

mschnell hat geschrieben:Was die Leute permanent irgendwo verwenden ist definitionsgemäß kein "Alter Zopf" (auch wenn mir ebenfalls der Sinn dieser merkwürdigen Codierung-Methodik völlig schleierhaft ist).

-Michael

Ist halt wirklich ein alter Zopf, doch leider in absehbarer Zeit nicht zu vermeiden: Siehe z.B. hier

Code: Alles auswählen

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

Antworten