Umlaute in IpHtmlPanel

Rund um die LCL und andere Komponenten
Antworten
lzuser
Beiträge: 97
Registriert: Sa 20. Jun 2009, 16:00
OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
CPU-Target: 64Bit

Umlaute in IpHtmlPanel

Beitrag von lzuser »

Win10-Laz1.6
Für einige kleine Hilfen möchte ein wenig HTML-Text in einem IpHtmlPanel ausgeben. Mit den mehrfach vorgeschlagenen Prozeduren klappt das.
Das Problem bleiben die deutschen Umlaute usw. Im Browser habe ich das mit <head><meta charset=iso-8859-1></head> gelöst, was hier aber nicht funktioniert.
Weitere erfolglose Versuche:
<meta charset="utf-8">
ö
&ouml
&#246
Was mache ich falsch? Wie kann ich das Problem lösen? Danke schon mal für Vorschläge.

lzuser
Beiträge: 97
Registriert: Sa 20. Jun 2009, 16:00
OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
CPU-Target: 64Bit

Re: Umlaute in IpHtmlPanel

Beitrag von lzuser »

Ich antworte mir mal selbst, vielleicht hilft es anderen auch.
Meine Lösung: Zusätzliche Installation von HtmlViewer
https://github.com/BerndGabriel/HtmlViewer
Damit funktioniert die Anzeige auch der Umlaute wie gewünscht.
Schade nur, dass es wohl keine Lösung für das IpHtmlPanel gibt.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Umlaute in IpHtmlPanel

Beitrag von wp_xyz »

Leider waren das viel zu spärliche Angaben, und ich dachte, da kommt sicher noch irgendwas.

Ich bin relativ sicher, dass IpHTMLPanel mit Umlauten klarkommt. Du müsstest mal die html-Datei posten oder verlinken, damit man sich die mal ansehen kann.

lzuser
Beiträge: 97
Registriert: Sa 20. Jun 2009, 16:00
OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
CPU-Target: 64Bit

Re: Umlaute in IpHtmlPanel

Beitrag von lzuser »

Ganz primitiver Text:

Code: Alles auswählen

 
var Inhalt:string;
...
Inhalt:=
'<html>'
+'<head>'
+'<title>Titelleisten-Text</title>'
+'<meta charset="iso-8859-1">'
+'</head>'
+'<body bgcolor="#ffff00">'
+'<h2>Testen</h2> Testen ist <b>immer</b> gut.<br>'
+' Text<i>kursiv</i> <sub>unten</sub> Text <sup>oben</sup><br>'
+'Umlaute: öäü ÖÄÜ ßß<br>'
+'</body>'
+'</html>';
 
IpHtmlPanel.SetHtmlFromStr(Inhalt);
 


Bis auf die Umlaute (öäü ÖÄÜ ßß) erscheint der Rest wie gewünscht.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Umlaute in IpHtmlPanel

Beitrag von wp_xyz »

Wenn du oben unter Meta als charset iso-8859-1 einträgst, dann muss die Datei natürlich genau so codiert sein. Du schreibst den html-Text aber in den Lazarus-Quelltext, und der ist UTF-8. Und hier hat IproHtmlPanel offenbar ein Problem, denn das Meta-Tag wird offenbar nicht richtig ausgewertet: die interne Variable FDocCharSet bleibt weiterhin auf 'iso-8859-1', auch wenn unter Meta 'utf-8' eingetragen ist. Mal sehen, ob ich das finde...

Zur Kontrolle: speichere ich dein html (mit iso-8859-1) als eigene Datei, wobei ich im Notepad++ die Dateikodierung genauso einstelle, dann werden die Umlaute vom IproHtmlPanel korrekt angezeigt.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Umlaute in IpHtmlPanel

Beitrag von wp_xyz »

Fehler gefunden. Das Charset-Attribut des Meta-Tags sollte in der Trunk-Version nun nicht mehr ignoriert werden.

In deinem konkreten Projekt (html als string im Pascal-Quelltext) musst du nur charset="utf-8" ins Meta-Tag schreiben (statt "iso-8859-1").

Code: Alles auswählen

var Inhalt:string =
'<html>'
+'<head>'
+'<title>Titelleisten-Text</title>'
+'<meta charset="utf-8">'      // <--- hier "utf-8"
+'</head>'
+ ...

lzuser
Beiträge: 97
Registriert: Sa 20. Jun 2009, 16:00
OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
CPU-Target: 64Bit

Re: Umlaute in IpHtmlPanel

Beitrag von lzuser »

sollte in der Trunk-Version nun nicht mehr ignoriert werden

Diesen Satz habe ich nicht verstanden. Hast du irgendwas bei IpHtmlPanel verändert oder zusätzlich eingestellt?

<meta charset="utf-8"> hatte ich wie berichtet doch schon probiert, selbst bei diesem einfachsten Beispiel funktioniert es nicht.
Zwischendurch: Danke für dein Mitdenken.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Umlaute in IpHtmlPanel

Beitrag von wp_xyz »

lzuser hat geschrieben:
sollte in der Trunk-Version nun nicht mehr ignoriert werden

Diesen Satz habe ich nicht verstanden. Hast du irgendwas bei IpHtmlPanel verändert oder zusätzlich eingestellt?

Ja. Trunk ist die Entwicklerversion von Lazarus, du brauchst SVN um darauf zuzugreifen. Oder du verwendest FPCUpDeluxe für die Installation.

Die Änderungen sind überschaubar und können auch leicht in eine andere Version des IpHtmlPanels eingebaut werden:
  • Öffne die Datei (lazarus)/components/turbopower_ipro/iphtmlgenerated.inc
  • In der Nähe von Zeile 110 gibt es die Aufzählung TIpHtmlAttributesSet. Füge zwischen htmlAttrCELLSPACING und htmlAttrCHECKED den Wert htmlAttrChARSET ein
  • Weiter unten, etwa Zeile 400, gibt es das Array TIpHtmlAttributesNames. Füge ebenfalls zwischen 'CELLSPACING' und 'CHECKED' den String 'CHARSET' ein (groß geschrieben).
  • Öffne die Datei (lazarus)/components/turbopower_ipto/iphtml.pas
  • Suche die Prozedur TIpHtml.ParseMeta und ersetze sie durch diesen Code:

    Code: Alles auswählen

    procedure TIpHtml.ParseMeta;
    {$IFDEF IP_LAZARUS}
    var
      i,j: Integer;
    {$ENDIF}
    begin
      with TIpHtmlNodeMETA.Create(Parent) do begin
        HttpEquiv := FindAttribute(htmlAttrHTTP_EQUIV);
        Name := FindAttribute(htmlAttrNAME);
        Content := FindAttribute(htmlAttrCONTENT);
        {$IFDEF IP_LAZARUS}
        if SameText(HttpEquiv, 'content-type') and not FHasBOM then begin
          j := pos('charset=', lowercase(Content));
          if j>0 then begin
            j := j+8;
            i := j;
            while (j<=Length(Content)) do begin
              if Content[j] in [' ',';','"',','] then
                break;
              inc(j);
            end;
            fDocCharset := copy(content, i, j-i);
          end else
            fDocCharset := FindAttribute(htmlAttrCHARSET);
        end;
        {$ENDIF}
        Scheme := FindAttribute(htmlAttrSCHEME);
      end;
      NextToken;
    end;
  • Anschließend das Package turbopoweripro.lp neu übersetzen
  • Und vorher nicht vergessen, eine Sicherungskopie der geänderten Dateien anlegen

lzuser hat geschrieben:<meta charset="utf-8"> hatte ich wie berichtet doch schon probiert, selbst bei diesem einfachsten Beispiel funktioniert es nicht.

Klar, es liegen ja zwei Fehler vor: zum einen der oben korrigierte Fehler im IpHtmlPanel, der das CharSet-Attribut im Meta-Tag ignoriert hat. Und zum anderen dein Fehler, weil dein Html-Quelltext UTF8-kodiert ist, du dem Browser aber sagst, es wäre iso-8859-1.

lzuser
Beiträge: 97
Registriert: Sa 20. Jun 2009, 16:00
OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
CPU-Target: 64Bit

Re: Umlaute in IpHtmlPanel

Beitrag von lzuser »

Hochachtung für dein überaus großes Engagement. Ich bin auf jeden Fall ein Stück schlauer geworden.
Ob ich mir den Weg zutraue, weiss ich noch nicht.
Es wäre schön, wenn die Fehlerbeseitigung in die nächste Laz-Version einfließen würden.
Vielen Dank nochmal.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Umlaute in IpHtmlPanel

Beitrag von wp_xyz »

lzuser hat geschrieben:Es wäre schön, wenn die Fehlerbeseitigung in die nächste Laz-Version einfließen würden.

Nachdem die Version 1.8 quasi vor der Tür steht, bin ich zögerlich die Änderungen noch reinzuquetschen. Ich hab's zwar getestet, aber man weiß nie, was man da alles übersieht, und jemand anders sollte das schon nochmals ausprobieren. Aber wenn du's schon nicht machst, dann müssen wir halt auf die Community warten, und damit dauert's bis zu Version 1.10.

Antworten