Skip to content

HTML 5 und CSS 3.0

Aktuelle Browser setzen zunehmend die neuen Möglichkeiten von HTML 5 und CSS 3.0 um, die ich in meinem Artikel “Webdesign anno 2015” bereits angerissen hatte. Doch was ist daran alles neu?

HTML 5

Der aktuelle HTML-Standard macht endgültig Schluss mit den schon lange verpönten “Design”-Elementen zur optischen Gestaltung und erweitert HTML um neue Möglichkeiten, insbesondere im Zusammenhang mit Javascript.

  • Rein optische Gestaltungselemente wie Frames oder <font>, <bgcolor>, <align> oder <big> gibt es nicht mehr. Ein standardkonformes HTML-5-Dokument darf solche Elemente nicht enthalten. HTML dient der semantischen Auszeichnung von Elementen, also der Beschreibung, was ein Element ist und nicht wie es aussehen soll.

  • Bestehende, bisher rein gestalterische Elemente wurden neu definiert und mit einer semantischen Bedeutung versehen.
    So ist <big> für die Kennzeichnung einer größeren Schrift entfallen, <small> aber geblieben; nur bezeichnet es keine kleinere Schriftgröße mehr, sondern quasi das “Kleingedruckte”, also weniger wichtige Ergänzungen. Auch <b> und <i>, früher für Fett- und Kursivschrift zuständig, bleiben erhalten. Sie bezeichnen jetzt optisch hervorgehobenen Text, der aber keine besondere Wichtigkeit hat; dafür gibt es die bestehenden semantischen Elemente <strong> und <em>.
    Soll also ein Begriff als wichtig oder bedeutsam hervorgehoben werden, greift man zu <em> oder <strong>. Sollen bspw. Marken- oder Personennamen, Fachbegriffe o.ä. gekennzeichnet werden, ohne dass damit aber eine besondere Betonung verbunden ist, sind <b> und <i> angebracht, auch wenn möglicherweise beide Varianten optisch identisch dargestellt werden. “HTML 5 ist ein neuer Standard” wäre mithin ein Fall für <i>, “Sie sollten sich damit auf jeden Fall auseinandersetzen!” wäre ein Fall für <em>.

  • Es gibt eine Reihe neuer Elemente wie bspw. <time>, vor allem aber neue Gliederungselemente.
    Wo bisher allüberall <div> verwendet wurde, um den Seiteninhalt zu strukturieren, treten nun Elemente wie <header>, <footer>, <nav> oder <aside> auf, die wie <div> verwendet werden können, aber eine zusätzliche semantische Bedeutung haben: als Kopf- oder Fußzeile, als Navigation oder zusätzliche Erläuterung. Der Hauptteil wird durch <section> und <article> gegliedert.

  • Hinzu kommen neue, einheitliche Attribute, die bspw. in Form von data-* auch die einfachere Anbindung von Javascript ermöglichen oder wie role oder aria-* eine möglichst barrierefreie Nutzung ermöglichen. Besonders gilt das für Formulare, bei denen sich ganz neue Möglichkeiten der Eingabevalidierung direkt durch den Browser (ohne Javascript) ergeben, weil ein Datumsfeld eben nur valide Daten oder ein E-Mail-Feld nur syntaktisch korrekte E-Mail-Adressen akzeptieren muss.

  • Außerdem kommen neue Möglichkeiten der Einbindung von Objekten, bspw. via <svg> oder <math>, hinzu, sowie vielfältige APIs für Javascript (Stichwort <canvas>, File-API oder Geolocation-API). Mit diesen Features habe ich mich aber noch nicht näher beschäftigt.

CSS 3.0

HTML wird ergänzt durch CSS. HMTL definiert, was ein Element ist: eine Überschrift, ein Absatz, eine Liste, eine Tabelle. CSS definiert, wie etwas aussehen soll: groß, klein, fettgedruckt, bunt, …

Die wichtigste Neuerung in CSS 3.0 sind sicherlich die Media Queries, die es ermöglichen, je nach Größe des Bildschirmfensters unterschiedliche Formatierungen anzuwenden. Wird die Webseite auf einem Smartphone aufgerufen, werden die Stilangaben für kleine Bildschirme verwendet; schaut man sie sich auf einem großen Bildschirm eines Desktoprechners an, kann sie ganz anders aussehen. Und verkleinert man auf dem Desktoprechner das Browserfenster, passt sich die Webseite wieder den neuen Dimensionen an.

Das ermöglicht responsive design - eine Website, die auf allen Geräten möglichst gleichermaßen gut aussieht. Auf dem Smartphone versteckt sich die Navigation hinter einem Button, die Inhaltsübersicht der aktuellen Seite wird ausgeblendet, die Seitenspalte mit ergänzenden Hinweisen steht vor oder nach dem Haupttext. Auf dem Tablet erscheint die Navigation; auf dem Desktop kommt auch die Seitenspalte zu ihrem Recht und wandert an die Seite, und die Inhaltsübersicht erscheint.

Selektoren und Pseudoklassen ermöglichen es, ganz zielgenau nur bestimmte Elemente zu formatieren: nicht jeden Absatz, sondern nur den Absatz direkt hinter einer Überschrift, oder nicht jedes Element einer Liste, sondern nur das erste oder letzte. Pseudoelemente ermöglichen es, vor oder hinter Elementen “etwas” einzufügen oder den ersten Buchstaben oder die erste Zeile gesondert zu behandeln. Beispiele dafür habe ich bereits im Beitrag “Kennzeichnung von Links in HTML-Dokumenten” gebracht.

Listen können in vielfältiger Weise formatiert werden; in Verbindung mit Pseudoelementen und Countern können sie bspw. (wie auch Überschriften) automatisch durchnummeriert werden.

Ganz neue Gestaltungsmöglichkeiten ermöglichen Farbverläufe und Schatten sowie Animationen mit transform und transition - ganz ohne Javascript, nur in CSS.

Die Möglichkeiten sind geradezu grenzenlos. :-)

Literaturempfehlungen

Neben einer Unzahl von Quellen im Web gibt es zu diesem Themenkomplex auch Bücher auf gedrucktem Papier, bspw.

  • HTML5 & CSS3 Webentwicklung mit den Standards von morgen von Brian P Hogan
    O’Reilly, 1. Auflage 2011, 272 Seiten, ISBN 978-3-89721-316-6
    Eine kurze, aber umfassende Vorstellung der Features und Veränderungen für den schnellen Einstieg in die Praxis.

  • HTML5 Webseiten innovativ und zukunftssicher von Peter Kröner
    Open Source Press, 2. Auflage 2011, 592 Seiten, ISBN 978-3-941841-34-5
    Das Buch beschreibt (nur) HTML 5, seine Anwendung, Umsetzung und Neuerungen in größerer Breite.

  • Flexible Boxes Eine Einführung in moderne Websites von Peter Müller
    Galileo Press, 1. Auflage 2013, 448 Seiten, ISBN 978-3-8362-2519-9
    In diesem Buch stehen nicht HTML, CSS oder seine Möglichkeiten, sondern die Gestaltung moderner Webseiten im Mittelpunkt: ausgehend von der semantischen Struktur des Inhalts (HTML) über dessen Gestaltung (CSS) bis zum Zusammenspiel dieser einzelnen Elemente, orientiert an praktischen Beispielen.

Ich wünsche fröhliches Gestalten und freue mich über Kommentare, Ergänzungen und eigene Erfahrungen!

Dieser Beitrag gehört zur Reihe “Webdesign anno 2015”.

[Dieser Eintrag wurde nachträglich im Februar 2015 veröffentlicht.]

Kennzeichnung von Links in HTML-Dokumenten

Bei der Gestaltung einer Website sollten Links gut als eben solche erkennbar sein - am besten unterstrichen und in dem gewohnten blauen Farbton, damit der Nutzer sie im Fließtext erkennen kann (in der Navigation ist das nicht von vergleichbarer Wichtigkeit, weil dort mit “klickbaren” Texten gerechnet wird).

Bestimmte Arten von Links möchte man oft dennoch abweichend kennzeichnen - zum Beispiel “mailto:“-Links, also solche, die nicht auf eine andere Webressource, sondern auf eine E-Mail-Adresse zeigen, und vielleicht auch andere Links, deren URL ein ungewohntes Protokoll enthält.

Man könnte solche Links in verschiedenen Farben anzeigen, aber das wäre alles andere als selbsterklärend, und der Websurfer heutiger Tage dürfte wohl kaum erst eine Erläuterungseite zur Gestaltung der betrachteten Webpräsenz studieren wollen, um sich zu vergewissern, was ihm ungewohnte Farben und Symbole sagen wollen. Unmissverständlich hingegen ist ein Icon, für eine E-Mail-Adresse bspw. ein Briefumschlag (früher auch gerne ein - am besten blinkendes oder rotierendes - @-Symbol). Auf diese Weise kann man Links auf E-Mail-Adressen zum Beispiel so auszeichnen:

<img src="/imgs/envelope.gif" /> <a href="mailto:thh@inter.net">thh@inter.net</a>

Für den Fall, dass häufiger Mailadressen im Text vorkommen, ist das allerdings etwas aufwendig, vor allem, wenn man das Prinzip auch noch auf andere Arten von Links ausdehnen möchte. Werden die Webseiten ohnehin durch eine Skriptsprache generiert, bspw. durch PHP, kann man stattdessen natürlich eine passende Funktion verwenden, die bspw. über den Aufruf mailto('thh@inter.net') die obige Ausgabe erzeigt. So richtig elegant ist das aber immer noch nicht.

"Kennzeichnung von Links in HTML-Dokumenten" vollständig lesen

Webdesign anno 2015

Webdesign ist ein Beruf - und eine Kunst. Und damit nichts, was man sich “mal eben” im Vorbeigehen für die professionelle Gestaltung der eigenen Webpräsenz aneignen kann.

Dennoch müssen Webseiten (gerade heute!) nicht mehr entweder “klassisch schlicht” oder … nun ja, bunt überladen und/oder unbeholfen aussehen wie in den Neunzigern. Die technischen Entwicklungen der letzten Jahre erlauben es vielmehr auch dem interessierten Laien, mit vertretbarem (Lern-) Aufwand durchaus ansehnliche Ergebnisse zu erzielen.

Für ein wirklich individuelles Konzept wird man freilich weiterhin sowohl über die notwendige Kreativität für einen entsprechenden Entwurf und dann auch die handwerklichen Kenntnisse verfügen müssen, um diesen Entwurf auch umzusetzen. Andererseits muss ich (zumindest für mich) gestehen, dass alle Webseiten, die ich in den letzten mehr als 15 Jahren gestaltet habe, ohnehin nicht “kreativ” in diesem Sinne waren. Vielmehr habe ich entweder vorhandene Templates als Basis genommen oder mich von anderen Seiten, die mir gut gefallen haben, “inspirieren” lassen - entweder nur optisch oder auch mit Anleihen aus den CSS-Definitionen. Wem das genügt - und die Auswahl an “Mustern” ist ja nun mittlerweile nahezu unendlich groß -, der hat gute Chancen, mit überschaubarem Zeiteinsatz seine bestehenden Seiten optisch und technisch ins 21. Jahrhundert zu befördern oder neue Seiten mit einem modernen “look & feel” zu schaffen, so lange er zumindest ein wenig mit den Grundzügen von HTML und CSS vertraut ist.

Ich möchte in der Folge - und in einer kleinen Serien von Beiträgen über die nächsten Wochen - einen Überblick über diese Möglichkeiten geben; wohlgemerkt einen Überblick aus der Sicht eines interessierten Laien, der selbst noch nicht alle Facetten dessen, was möglich ist, überblickt (und auch nicht immer trittsicher in den zugehörigen Begrifflichkeiten ist). Daher freue ich mich über ergänzende - oder berichtigende - Kommentare.

"Webdesign anno 2015" vollständig lesen

Wellenreiten 12/2014

Wer als “Websurfer” metaphorisch auf den Wellen des Netzes reitet, findet dabei zwar keine paradiesischen Inseln, manchmal aber immerhin ganz interessante Lektüre.

Im Dezember 2014 kann ich u.a. folgende Fundstücke empfehlen und der werten Leserschaft ans Herz legen:

Tips, Tricks & Tech

Cybercrime

WLAN unterwegs

Medizin

Sehenswertes

  • Nuggets
    Ein durch seinen einfachen Stil umso eindrücklicherer Animations-Film zum Thema “Sucht”.

Meine Blogroll wächst

Im vergangenen Monat habe ich folgende Blogs neu abonniert:

Lesetagebuch 2014

Die Tradition des Lesetagebuchs hat mich auch im vergangenen Jahr 2014 begleitet, in dem ich mir verschiedentlich, sozusagen blockweise, einmal wieder mehr Zeit zum Lesen genommen und den Stand von 2011 ein-, nein, sogar überholt habe:

  • im Jahre 2014 gelesene Bücher: 66 (2013: 35)
  • im Jahre 2014 gelesene Seiten: 25.169 (2013: 12.694)
    (davon 11.101 deutsche und 14.068 englische)

Insofern habe ich im Schnitt mehr als ein Buch pro Woche “geschafft”; nicht unerheblich mitgewirkt hat dabei freilich mein Erwerb eines Kindle Paperwhite im Juli diesen Jahres. So sind von den 66 Büchern immerhin 24 E-Books gewesen (also gut 35%, mit 6.806 von 25.169 Seiten, also nur gut 25% der gelesenen Seiten - zumindest die von mir gelesenen E-Books sind also kürzer als die konventionellen “Schmöker”).

Mit insgesamt 16 Büchern war Karen Rose die 2014 am meisten gelesene Autorin (ich dürfte damit alle von ihr verfügbaren Bücher gelesen haben), gefolgt von Mercedes Lackey mit 10 Büchern - von Lackey habe ich schon vor Jahren etliche Bücher gelesen und war dann irgendwie davon abgekommen; jetzt bin ich mit einigen ungelesenen Büchern von meinem großen Stapel wieder eingestiegen und habe dann die jeweiligen Serien entsprechend ergänzt. Einige Bücherbestellungen sind dabei auch erst einmal wieder auf dem Stapel gelandet. Dazu kam schließlich noch einige leichte (Kindle-)Kost von Katharina Peters (4 Bücher) und Elke Bergsma (7 Bücher), und natürlich diverse Einzelwerke, namentlich regionale Krimis und der “Gibraltar”-Zyklus von McCollum.

Zum Lesen der von mir bestellten zwei oder drei Werke von Ian Rankin bin ich 2014 nicht gekommen; die Bücher liegen noch auf dem Stapel, genau wie einige Bücher von Karin Slaughter, Inge Löhning, ein paar dicke Wälzer von Ken Follett sowie eine ganze Reihe Bücher von John Scalzi, die ich dieses und letztes Jahr gesammelt habe. Für 2015 bin ich also bereits gut mit Lesestoff versorgt. :-)

Frühere Lesetagebücher:

Alle vier Jahre wieder ...

Verbandmittel
Ein fast vollständiger Stapel von Austauschmaterial.

Nach vier Jahren ist es wieder einmal soweit: rechtzeitig vor dem Verfall werden Verbrauchsmaterial (Medizinprodukte) und Arzneimittel umgewälzt. Das kommt angesichts einer üblichen Haltbarkeit von fünf Jahren im vierjährigen Rhythmus offensichtlich ganz gut hin.

Google Calendar ausdrucken

Wie ich bereits vor 2 Monaten berichtet hatte, nutze ich den Kalender von Google, benötige aber auch “Ausdrucke” (richtiger: PDF-Fassungen) meiner Termine. Bislang hatte ich dazu Outlook genutzt, das die Daten aus dem Google-Kalender importieren kann, aber diese Möglichkeit fällt seit der Neuinstallation meines Laptops weg, weil ich - wenn möglich - nicht nur zum Drucken des Google-Kalenders Outlook installieren (und ggf. kaufen …) möchte.

Also benötige ich jetzt eine neue Lösung zum Drucken meines Kalenders (unter Windows, ersatzweise auf einer Linux-Shell) … und das erweist sich als überraschend schwierig. Dabei sind meine Anforderungen gar nicht so groß:

  • Auch längere Terminsbeschreibungen sollen - durch Zeilenumbruch - im Ausdruck lesbar bleiben.
  • Es sollen beliebige Zeiträume (jeweils ganze Wochen) auf eine Seite gedruckt werden können, also bpsw. 4-5 Wochen ab heute, auch wenn diese Wochen in verschiedenen Monaten liegen.

Optional wäre es noch nett, wenn …

  • … der Ausdruck einigermaßen ansehnlich ist, vielleicht sogar dem Druckergebnis von Outlook nahekommt.
  • … die farbige Kennzeichnung der Termine aus dem Google-Kalender übernommen wird.
  • … neben der Startzeit eine Dauer oder die Endzeit gedruckt werden kann.
  • … verschiedene Google-Kalender gedruckt werden können.

Google selbst ermöglicht natürlich den Kalenderdruck, scheitert aber an beiden zwingenden Anforderungen. Weder gibt es einen Zeilenumbruch - was zur Wahl zwischen “unlesbar kleiner Schrift” und “abgeschnittenen Terminsbeschreibungen” führt - noch können freie Zeiträume auf eine Seite gedruckt werden. Es ist zwar möglich, bspw. die letzten beiden Dezember- und die ersten Januar-Wochen zu drucken; die finden sich dann aber zwingend nach Monaten getrennt auf zwei Seiten. Dafür scheint es auch nicht wirklich eine Lösung zu geben.

Also habe ich mich frohgemut zur Google-Recherche aufgemacht. So schwer sollte das ja nicht sein, schließlich muss ich nicht direkt aus dem Google-Kalender drucken können; mir genügt eine Applikation, die sich mit dem Google-Kalender synchronisieren lässt oder wenigstens ICAL- (oder XML-) Dateien einlesen kann und dann entsprechende Ausdrucke ermöglicht.

"Google Calendar ausdrucken" vollständig lesen

Wechsel meines GPG-Schlüssels

Vor mehr als 15 Jahren habe ich mir - damals noch ausschließlich unter Windows - den ersten eigenen PGP-Key erstellt. Einige Jahre später habe ich diesen alten Schlüssel dann für alle praktischen Zwecke durch einen neuen Key ersetzt. Hanno hat mich jetzt dieser Tage daran erinnert, dass besagter aktueller GPG-Schlüssel ja nun auch schon wieder 10 Jahre alt ist und überdies von der Art und Länge her nicht mehr dem heutigen Standard entspricht.

Also ersetze ich meinen bisherigen Schlüssel:

  pub   1024D/144793AD 2004-10-01
    Key fingerprint = 74A6 8BEE C744 D06C 77D9  BFF5 0F23 6046 1447 93AD

ab sofort durch folgenden neuen Schlüssel:

  pub   4096R/04777287 2014-12-27 [expires: 2024-12-24]
    Key fingerprint = 0276 6D9A CBB6 7FC3 0CBD  93F8 64F6 2D3B 0477 7287

Der alte Schlüssel bleibt noch eine Zeit lang gültig; ich bitte aber darum, nur noch den neuen Schlüssel zu verwenden. Dieser steht auf den Keyservern und auf meiner Webseite unter http://th-h.de/download/0x04777287.asc zum Download bereit.

Außerdem gibt es ein mit beiden Schlüsseln signiertes Transition statement.

Retry, reboot, reinstall?

In den letzten Jahren habe ich im Schnitt alle drei Jahre einen neuen Laptop eingerichtet. Mal war das bisherige Modell uralt und mit ausgerissenen Scharnieren und ausgelutschten Akkus erneuerungsreif, mal wurde sein Leben durch ein umgekipptes Weinglas vorzeitig beendet, mal war es ein obskures Hitzeproblem, das zu ständigen Hängern führte, mal wollte ich einfach etwas neueres, größeres, schöneres und besseres, obwohl das aktuelle Gerät eigentlich noch ganz in Ordnung war. Insgesamt kam das meistens recht gut aus; wenn der Akku allmählich erste Schwächen zeigte, wenn das System gefühlt immer langsamer lief - aus welchen Gründen auch immer -, stand ein Austausch an.

Nachdem mein aktueller Laptop mittlerweile bereits dreieinhalb Jahre alt ist, der Akku aber zumindest noch einigermaßen frisch erscheint und mich nur der manchmal seeehr langsame Betrieb stört, habe ich mich entschlossen, es diesmal einmal anders zu versuchen und statt eines Neukaufs einfach einmal auf eine Neuinstallation zu setzen. (Angesichts der Tatsache, dass ich gerade letztes Jahr Firefly durch ein Neugerät ersetzt hatte, vielleicht auch keine schlechte Idee.)

Dummerweise dauert so etwas ja immer länger; meine Schätzung, dass die Aktion in einem halben Tag erledigt sein sollte, hat sich - fast schon erwartungsgemäß - als übermäßig optimistisch erwiesen, nachdem alleine Download und Installation der notwendigen Windows-Updates (nach Wiederherstellung der Auslieferungszustands von 2011) vier bis fünf Stunden in Anspruch nahm. :-) Und danach fängt die Neuinstallation notwendiger, angenehmer oder vielleicht auch überflüssiger Software ja erst an …

Inzwischen kann ich aber Vollzug vermelden; Landroval ist jetzt neu installiert und eingerichtet. Gespannt bin ich jetzt vor allem darauf, wie sich denn nun das Laufzeitverhalten darstellt und ob die träge Reaktion wirklich - wie man immer mal wieder lesen kann - an der alten und “vollgemüllten” Windows-Installation lag oder an anderen Ursachen.

Serendipity 2.0-rc2

Rund vier Monate nach der Installation der dritten Beta-Version von Serendipity 2.0 steht nun der erste (bzw. nach der schnellen Behebung eines kritischen Fehlers direkt der zweite) Release-Candidate zur Verfügung - sozusagen als kleines Weihnachtsgeschenk. :-)

Nach kurzem Test in meinem, nun ja, Testblog, setze ich diese Version jetzt auch direkt hier auf Netz - Rettung - Recht ein. Etliche (vor allem kleinere, teilweise aber auch nervige) Fehler wurden noch behoben (so zum Beispiel das Problem der ständig im Editor auftauchenden “Sicherheitskopien” älterer Eintragsentwürfe), einiges neu gestaltet (so die Auswahl der Kategorien und Tags und, sehr praktisch, ein Umschalter zwischen “Entwurf” und “Veröffentlichung” direkt beim “Speichern”-Button), und bisher bin ich sehr zufrieden.

Mal gucken, was sich noch an kleinen angenehmen Neuerungen - und vielleicht auch an verbliebenen Ecken und Kanten - findet. Ich bin gespannt, würde aber den Release-Candidate bereits jetzt empfehlen. (Klar, eine Sicherung der Dateien und der Datenbank (!) ist vor dem Update geboten.)

Ich hoffe, dass ich über die Weihnachtstage oder irgendwann im nächsten Jahr auch wieder einmal dazu komme, die Entwicklung näher zu verfolgen; einige kleine Kommentare und Bug-Reports haben sich noch angesammelt, die ich aber erst einmal reproduzieren und formulieren muss. Aber mit 2.0 soll die Entwicklung ja nicht beendet sein. ;-)

"Serendipity 2.0-rc2" vollständig lesen

htmlspecialchars(), PHP 5.4 und eine leere Ausgabe

Erst dachte ich, es liegt an mir - ich bin eben kein “Softwareentwickler”, sondern Dilettant (wie ich hoffe, im ursprünglichen Sinne). Nachdem jetzt aber auch ein Projekt wie Serendipity davon “gebissen” wurde, lohnt es sich vielleicht doch, ein paar Worte dazu zu schreiben, die anderen eine lange Google-Recherche ersparen.

Kurzum: Wenn nach einem PHP-Update (bspw. von Debian Squeeze mit PHP 5.3.3 auf Debian Wheezy mit PHP 5.4.35) Webapplikationen plötzlich verrückt spielen und Texte verschwinden, liegt das an einem geänderten Default der PHP-Funktion htmlspecialchars().

Die Langfassung

Nach einem Update meines Servers auf das aktuelle Debian Anfang diesen Jahres stellte ich fest, dass u.a. bei votetakers.de manche Teile der Seite einfach verschwunden waren. Eine genauere Betrachtung ergab, dass es sich dabei exakt um solche Teile handelte, die (a) dynamisch generierte Inhalte enthalten, aus denen mit der Funktion htmlspecialchars() unerwünschter HTML-Code entfernt wird (indem <> in &amp;lt;&amp;gt; umgewandelt wird), und bei denen (b) im entsprechenden Text Umlaute vorkamen.

Nach erster Ratlosigkeit stellte ich fest, dass die einzige Änderung an dieser Funktion zwischen PHP 5.3 und PHP 5.4 der geänderte Default für den verwendeten Zeichensatz war. Vollständig besteht der Aufruf von htmlspecialchars() nämlich nicht nur in der Übergabe des zu konvertierenden Textes in der Art htmlspecialchars('Ich bin ein Tästtext!'), sondern enthält u.a. auch noch Flags und das Encoding:

  1. string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = &#8216;UTF-8&#8217; [, bool $double_encode = true ]]] )

Dabei hat sich der Default von ISO-8859-1 auf UTF-8 geändert:

If omitted, the default value of the encoding varies depending on the PHP version in use. In PHP 5.6 and later, the default_charset configuration option is used as the default value. PHP 5.4 and 5.5 will use UTF-8 as the default. Earlier versions of PHP use ISO-8859-1. 

Also habe ich testweise alle Aufrufe von htmlspecialchars() im Code ergänzt um passende Flags (zwingend, weil der Parameter im Funktionsaufruf vor $encoding steht und daher mit übergeben werden muss, wenn man $encoding setzen will) und das Encoding ‘ISO-8859-1’ … und danach tat es wieder.

Die Ursache dafür dürfte wohl darin liegen, dass htmlspecialchars() sinnigerweise einen leeren String zurückgibt, wenn der übergebene String - im entsprechenden Encoding - unzulässige Zeichen enthält:

If the input string contains an invalid code unit sequence within the given encoding an empty string will be returned, unless either the ENT_IGNORE or ENT_SUBSTITUTE flags are set.

Das führt dann zum “Verschwinden” der entsprechenden Text-Teile in der Ausgabe. Böse Falle.

Gut, man hätte vielleicht den Funktionsaufruf direkt richtig machen können, und warum das Problem überhaupt auftritt, obwohl die Datenbank als Collation “UTF-8’ hat, weiß ich auch nicht - vielleicht weil die Webseiten als Encoding ISO-8859-1 haben? Wie auch immer: so ist das nicht nett. Und noch weniger nett, dass es (vor PHP 5.6) keine Möglichkeit gibt, einen Default zu setzen, so dass man jeden (!) Aufruf von htmlspecialchars() mit Flags und Encoding “aufpeppen” muss - oder man ersetzt htmlspecialchars() sinnvollerweise direkt durch eine eigene Funktion, wie auch in einem Kommentar zur PHP-Dokumentation geraten wird.

Nachdem ich im März im Blog von Felix Pfefferkorn auf dieses Problem stieß und jetzt auch die Serendipity-Developer den Code kurz vor dem geplanten Release-Candidate noch einmal umkrempeln mussten, ist es wohl an der Zeit, dazu ein paar Worte zu schreiben - offenbar bin ich wenigstens nicht der einzige Dilettant (im besten Sinne, natürlich ;-)).

Nachwort

Ja, ich stehe dazu: ich hasse die Probleme mit Charset-Konversionen, überall - sowohl das unselige Problem der verschiedenen Zeilenende-Markierung in Windows und Unixen als auch Dinge wie das BOM (“Byte Order Mark”) am Anfang einer Textdatei, die dann durch ältere Software nicht mehr geöffnet werden kann, als auch die ganze unselige Hin-und-Her-Konvertiererei, oft ohne dass man der Datei ansehen könnte, welches Encoding sie denn nun genau hat. Am Ende stehen dann “kaputte” Postings, E-Mails oder Webseiten.

Und ich stehe auch dazu, dass ich den Umgang von PHP (und Apache und …) mit Zeichensätzen, insbesondere das Problem, wie man richtig mit Formulareingaben umgeht, einfach bisher nicht verstehe. Aber dazu wollte ich ohnehin bei Gelegenheit mal etwas schreiben.