<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>toscho.design&#187; Zeichen</title>
	<atom:link href="http://toscho.de/thema/zeichen/feed/" rel="self" type="application/rss+xml" />
	<link>http://toscho.de</link>
	<description>Redaktion und schwer geprüftes Webdesign aus Halle (Saale)</description>
	<lastBuildDate>Thu, 17 May 2012 23:03:08 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>daily</sy:updatePeriod>
	<sy:updateFrequency>4</sy:updateFrequency>
	
		<item>
		<title>PHP: Wörter zählen</title>
		<link>http://toscho.de/2012/php-woerter-zaehlen/</link>
		<comments>http://toscho.de/2012/php-woerter-zaehlen/#comments</comments>
		<pubDate>Thu, 17 May 2012 22:16:19 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[Zeichen]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1886</guid>
		<description><![CDATA[Wie man Worte in einem String zählt – und wie nicht.]]></description>
			<content:encoded><![CDATA[<p>Gegeben sei ein String (ein Text), der eventuell Markup enthält und <a href="http://graphicdesign.stackexchange.com/q/2160/4606" title="Why all the hate? --Two spaces after the period">doppelte Leerzeichen</a>. Wir wollen die Wörter zählen. Nun gibt es sehr unterschiedliche Ansichten darüber, was ein Wort ist: Mit Abkürzungen bzw. per Apostroph verschmolzenen Worten geht’s los, Chinesisch und andere Sprachen ohne fest vorgeschriebene Leerzeichen erschweren das Problem weiterhin.</p>
<p><a href="http://php.net/str-word-count"><code>str_word_count()</code></a> beispielsweise scheitert an fast allen Punkten, obendrein noch an Bindestrichen, Zahlen … und <a href="http://toscho.de/2010/warum-utf-8/" title="Warum UTF-8?">UTF-8</a>. Man kann daran vorbeieiern, aber der Aufwand lohnt sich einfach nicht.</p>
<p>Bleiben wir pragmatisch, nehmen <a href="http://de.wikipedia.org/wiki/Leerzeichen_in_Komposita" title="Wikipedia: Leerzeichen in Komposita">schlechtes Deutsch</a> seufzend hin und zählen einfach die Leerzeichen, ja?<br />
Nein. Manche Leute haben immer noch die Angewohnheit, hinter einen Punkt zwei Leerzeichen zu setzen, und im Markup tauchen sie selbstverständlich auch auf.</p>
<p>Also nochmal: Gegeben sei ein String …</p>
<pre class="notranslate"><var>$string</var> = '&lt;p class="foo bar"&gt; hello world.  two späceß.&lt;br /&gt;
bla&lt;/p&gt;'</pre>
<p>… aus dem wir erst das Markup entfernen:</p>
<pre class="notranslate"><var>$text</var> = strip_tags( <var>$string</var> );</pre>
<p>… dann die Leerzeichen am Anfang und am Ende:</p>
<pre class="notranslate"><var>$text</var> = trim( <var>$text</var> );</pre>
<p>Und jetzt entspräche die Menge der nicht aufeinanderfolgenden Leerzeichen <em>plus eins</em> der Menge dessen, was wir als Wörter akzeptieren. Wir müssen aber nicht addieren, sondern kleben einfach ein Leerzeichen hinten an und lassen einen trivialen regulären Ausdruck durchzählen:</p>
<pre class="notranslate"><var>$word_count</var> = preg_match_all( <code class="string">'~\s+~'</code>, <code class="string">"<var>$text</var> "</code>, <var>$m</var> );</pre>
<p>Ergebnis: 5.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2012/php-woerter-zaehlen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress-Plugin: Germanix</title>
		<link>http://toscho.de/2010/wordpress-plugin-germanix/</link>
		<comments>http://toscho.de/2010/wordpress-plugin-germanix/#comments</comments>
		<pubDate>Sun, 19 Dec 2010 14:07:28 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Zeichen]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1753</guid>
		<description><![CDATA[Kurzvorstellung meines Plugins zum Konvertieren von Umlauten und ähnlichen Zeichen für URLs und Dateinamen.]]></description>
			<content:encoded><![CDATA[<p><img src="http://toscho.de/wp-content/uploads/2010/12/germanix.png" alt="" title="germanix" width="150" height="150" class="alignright size-full wp-image-1800" /></p>
<p>Nicht neu, aber bisher ungebloggt: Das <a href="https://github.com/toscho/Germanix-WordPress-Plugin">Plugin Germanix</a> wandelt Umlaute und viele andere Nicht-ASCII-Zeichen in einen passenden Ersatz um und erstellt daraus <a href="http://toscho.de/2009/beste-url-struktur/">Permalinks</a> und Dateinamen. Es ersetzt das längst nicht mehr gepflegte Plugin <a href="http://otaku42.de/2005/06/30/plugin-o42-clean-umlauts/">o42-clean-umlauts</a>.</p>
<p>Germanix schlägt zu, wenn man eine Datei hochlädt oder einen Artikel anlegt. Bei neuen Schlagwörtern, Kategorien, eigenen Taxonomien und Post-Typen natürlich auch.</p>
<p>Ein Beispiel: Einem Artikel mit dem schönen Titel »12 m³ Scheiße« gibt WordPress ohne weitere Plugins den Slug <samp>12-m³-scheise</samp>. Jetzt haben wir ohne Not ein Nicht-ASCII-Zeichen darin, und ein entstelltes ß.</p>
<p>Germanix hingegen produziert <samp>12-m3-scheisse</samp>. Das paßt besser.</p>
<p>Das Plugin besteht eigentlich aus zweien: <em>Germanix URL</em> für URLs und Dateinamen und <em>Germanix Translate</em> für Übersetzungen im Backend. Beide Plugins lassen sich separat anschalten. Das Übersetzungsplugin werde ich vermutlich irgendwann fallen lassen – außer der Umwandlung von »Dashboard« nach »Übersicht« brennt darin nichts; manche Einträge sind sogar veraltet.</p>
<p>Fehler und Vorschläge wirf bitte in den <a href="https://github.com/toscho/Germanix-WordPress-Plugin/issues">Bugtracker</a>. Da finde ich sie wieder.<br />
Oder besser noch: <a href="http://help.github.com/forking/">Erstelle einen Fork</a>, baue deine Ideen selber ein und sende einen Push-Request zurück.</p>
<p>Solange das Plugin nur bei GitHub liegt und ich keinen eigenen Updateserver eingerichtet habe, wird es keine automatische Aktualisierung geben, nur Hinweise per <a href="http://twitter.com/toscho">Twitter</a>. Sorry!</p>
<p>Ich habe neulich ein anderes Plugin – <a lang="en" hreflang="en" href="http://wordpress.org/extend/plugins/remove-redundant-links/">Remove Redundant Links</a> – testhalber im offiziellen Verzeichnis abgelegt und bin schon jetzt so genervt von SVN, daß ich auf weitere Experimente damit wenig Lust verspüre. Ja, <a href="http://www.kernel.org/pub/software/scm/git/docs/git-svn.html#_caveats">git-svn</a> kenne ich. Das nervt auch.<br />
Schließlich geht es mir bei solchen Projekten auch um den Spaß an der Sache, also <em>nicht</em> um SVN.</p>
<p>Momentan wird der Windows-Livewriter noch nicht unterstützt. Wer das braucht, dem empfehle ich <a href="http://wordpress-buch.bueltge.de/das-wordpress-buch/downloads/extra/">Frank Bültges Alternative</a>. Die erfaßt weniger Zeichen und wird im Sprachverzeichnis abgelegt, wo sie sich nicht so einfach abschalten läßt wie ein Plugin. Dafür wandelt sie auch maskierte Zeichen um – das habe ich bisher weder gebraucht noch geschafft.</p>
<h2>Weitere WordPress-Plugins</h2>
<ul>
<li><a href="http://toscho.de/2011/wordpress-plugin-magische-widgets/">Magische Widgets</a></li>
<li><a href="http://toscho.de/2010/wordpress-plugin-icon-to-link/">Icon to Link</a></li>
<li><a href="http://toscho.de/2010/wordpress-plugin-backend-style-enhancements/">Backend Style Enhancements</a></li>
<li><a href="http://toscho.de/2010/wordpress-plugin-canonical-permalink/">Canonical Permalink</a></li>
<li><a href="http://toscho.de/2010/wordpress-tutorial-ein-framebreaker-plugin-schreiben/">Tutorial: Ein Framebreaker-Plugin schreiben</a></li>
<li><a href="http://toscho.de/2010/wordpress-grundeinstellungen-per-plugin-setzen/">Basic Settings</a></li>
<li><a href="http://toscho.de/2009/deppenlink-entfernen/">Remove Redundant Links</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/wordpress-plugin-germanix/feed/</wfw:commentRss>
		<slash:comments>51</slash:comments>
		</item>
		<item>
		<title>Designlinks 12</title>
		<link>http://toscho.de/2010/designlinks-12/</link>
		<comments>http://toscho.de/2010/designlinks-12/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 10:19:33 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Browser]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Links]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[Zeichen]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1669</guid>
		<description><![CDATA[Eine Katze, die gerne duscht, langsame Referenzen, schlanke User-Agent-Strings, fette Zeichenreferenzen, ein enorm flexibles Stylesheet und ein Malprogramm.]]></description>
			<content:encoded><![CDATA[<p>Wird mal wieder Zeit. Aber zuerst entspannen wir uns ein bißchen:</p>
<p class="wp-caption-text"><object type="application/x-shockwave-flash" data="http://www.collegehumor.com/moogaloop/moogaloop.swf?clip_id=1920326&#038;fullscreen=1" width="480" height="360" ><param name="allowfullscreen" value="true"/><param name="wmode" value="transparent"/><param name="allowScriptAccess" value="always"/><param name="movie" quality="best" value="http://www.collegehumor.com/moogaloop/moogaloop.swf?clip_id=1920326&#038;fullscreen=1"/><embed src="http://www.collegehumor.com/moogaloop/moogaloop.swf?clip_id=1920326&#038;fullscreen=1" type="application/x-shockwave-flash" wmode="transparent"  width="480" height="360"  allowScriptAccess="always"></embed></object><br />
Quelle: <a href="http://www.collegehumor.com/video:1920326" hreflang="en">CollegeHumor</a>.</p>
<p>›<a href="http://schlueters.de/blog/archives/125-Do-not-use-PHP-references.html" hreflang="en" lang="en">Do not use PHP references</a>‹, empfiehlt Johannes Schlüter, denn Referenzen kosten Tempo, Übersicht und Flexibilität. Ob seiner klaren und verständlichen Darstellung dieses kniffligen Themas möchte ich den Artikel jetzt schon in die Liste der zehn besten dieses Jahres rücken.</p>
<p>Nicholas C. Zakas: <a href="http://www.nczonline.net/blog/2010/01/12/history-of-the-user-agent-string/" hreflang="en" lang="en">History of the user-agent string</a>. Warum die UA-Strings heute oft so sonderbar aussehen. Die neue <a href="http://blogs.msdn.com/ie/archive/2010/03/23/introducing-ie9-s-user-agent-string.aspx" hreflang="en">Kennung des IE 9</a> lautet:</p>
<pre class="notranslate">Mozilla/5.0 (compatible, MSIE 9.0; Windows NT 6.1; Trident/5.0)</pre>
<p>Anhängsel irgendwelcher Zusatzsoftware werden nicht mehr eingebaut; damit schrumpft die <a href="http://www.useragentstring.com/_uas_Internet%20Explorer_version_8.0.php" hreflang="en">Liste der möglichen Kennungen</a> gewaltig – was es Proxys erheblich erleichtert, gespeicherte Versionen einer Webseite auszuliefern. Das erklärt Billy Hoffman gut in: ›<a href="http://zoompf.com/blog/2010/03/the-big-performance-improvement-in-ie9-no-one-is-talking-about" hreflang="en" lang="en">The Big Performance Improvement in IE9 No One is Talking About</a>‹. Er rät auch dazu, die <a href="http://toscho.de/2010/gzip-pro-und-kontra/">gzip-komprimierte</a> Version <em>nur noch</em> anhand des Accept-Headers zu versenden und den User-Agent zu ignorieren, damit beispielsweise ein Safari-Nutzer die Version bekommt, die der Firefox-Nutzer zuvor in den Proxy gehievt hat.</p>
<p>Man kann <a href="http://toscho.de/2008/zeichenkodierung-begriffe/#toc-maskierung-entity-und-zeichenreferenz">dezimale Zeichenreferenzen</a> mit beliebig vielen führenden Nullen versehen. So läßt sich das <samp>A</samp> als <code>&amp;#65;</code> schreiben oder als <code>&amp;#000000000000000000000000000000065;</code><br />
›hakre‹ hat mal ausprobiert, wie weit man damit gehen kann: ›<a href="http://hakre.wordpress.com/2010/02/25/html-entity-boundaries-zero-padding/" hreflang="en" lang="en">HTML Entity Boundaries – Zero Padding</a>‹.<br />
Ein Experiment, dessen praktischer Nutzen sicher weit unter seinem Unterhaltungswert liegt. Doch zeigt es, wie weit die Entwickler vorausdenken und wo sie die Grenze ziehen zwischen ›das versuche ich noch‹ und ›das wird zu langsam‹. Wenig überraschend frißt Firefox die meisten Nullen – bis zum Erstickungstod.</p>
<p>Anne van Kesteren hat auch ein Experiment mit gewaltigem Geekpotential hingestellt: <a href="http://annevankesteren.nl/test/contenteditable-style.htm" lang="en">Live style sheet editing!</a><br />
Und da muß ich einfach mal den Quelltext zitieren:</p>
<pre class="notranslate">&lt;!doctype html&gt;
&lt;html&gt;
 &lt;head&gt;
  &lt;title&gt;Live style sheet editing!&lt;/title&gt;
  &lt;style style="<code class="string">white-space:pre <i>/* hack for Opera */</i></code>" contenteditable=""&gt;
html {
margin:.2em;
font-size:2em;
color:lime;
background:purple
}
head, title, style
{
display:block
}
body {
display:none
}
  &lt;/style&gt;
 &lt;/head&gt;
 &lt;body&gt;<i>&lt;!-- nothing is needed here --&gt;</i>&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Zum Schluß noch ein Link für die Freunde der Maus: <a href="http://mrdoob.com/projects/harmony/">Harmony</a>, ein Zeichenprogramm in Javascript und Canvas. Das macht wirklich Freude.</p>
<p><img src="http://toscho.de/wp-content/uploads/2010/04/harmony-toscho.png" alt="Harmony. Ein Experiment." width="485" height="330" class="alignnone size-full wp-image-1670 border" /></p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/designlinks-12/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Warum UTF-8?</title>
		<link>http://toscho.de/2010/warum-utf-8/</link>
		<comments>http://toscho.de/2010/warum-utf-8/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 22:13:51 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[Zeichen]]></category>
		<category><![CDATA[UTF-8]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1614</guid>
		<description><![CDATA[Gründe für den Umstieg. Vorteile der Zeichenkodierung UTF-8.]]></description>
			<content:encoded><![CDATA[<p>Manche Leute halten <a hreflang="en" href="http://www.ietf.org/rfc/rfc2279.txt"><abbr title="Unicode transformation format" lang="en">UTF</abbr>-8</a> immer noch für Voodoo. Schade. Wer Textformate produziert, <em>muß</em> irgendwann 20 Minuten aufwenden, um die <a href="http://toscho.de/2008/grundlagen-zeichenkodierung/">Grundlagen der Zeichenkodierung</a> zu verstehen, und er <em>sollte</em> UTF-8 benutzen – und dabei wissen, was er tut. Warum?</p>
<p>UTF-8 ist eine Zeichenkodierung für <a hreflang="en" lang="en" class="notranslate" href="http://www.unicode.org/standard/standard.html">Unicode</a>. Damit können wir alle Zeichen aus Unicode benutzen, ohne sie zu <a href="http://toscho.de/2008/zeichenkodierung-begriffe/#toc-maskierung-entity-und-zeichenreferenz">maskieren</a>: das deutsche Alphabet und das chinesische, Währungszeichen, Musiknoten, Pfeile und Schachfiguren.</p>
<p>In E-Mails mag UTF-8 <a title="UTF-8-Unterstützung deutscher Webmail-Anbieter" href="http://www.walkingsmall.de/2009/04/07/email-clients-freemailer-und-utf-8/">noch nicht</a> immer angebracht sein; im <a href="http://toscho.de/thema/markup/" title="Meine Artikel zum Thema ›Markup‹">Markup</a> jedoch können wir nicht mehr darauf verzichten:</p>
<ul>
<li>In unseren <strong>Formularen</strong> wollen wir jedes Zeichen verarbeiten können. Wenn wir kein UTF benutzen, riskieren wir, wichtige Daten zu verlieren.</li>
<li>Alle <strong>XML-Parser</strong> <em>müssen</em> UTF-8 verstehen (und UTF-16). Newsfeeds, SVG, XSLT, RDF – all diese Formate sollten wir nur in UTF-8 oder UTF-16 schreiben, damit jeder sie gewiß verarbeiten kann.</li>
<li>Alle wichtigen <strong>APIs der großen Webdienste</strong> liefern UTF-8 aus: Flickr, Twitter, Youtube oder Delicious. Wenn wir diese Daten verarbeiten wollen, sollten wir uns nicht den Umweg einer Konvertierung zumuten.</li>
<li>UTF-8 ist im Unterschied zu UTF-16 bedingt <strong>kompatibel zu US-ASCII</strong>, denn alle ASCII-Zeichen werden deckungsgleich kodiert. Zeichen oberhalb des Dezimalwerts 127 freilich brauchen zwei Bytes. Deshalb ist es in allen Sprachen, die eine Variante des lateinischen Alphabets verwenden, sehr <strong>kompakt</strong>.</li>
<li>Die meisten Browser <a href="http://www.w3.org/International/articles/idn-and-iri/" title="An Introduction to Multilingual Web Addresses" hreflang="en">verwenden</a> für <strong>Nicht-ASCII-Zeichen in URLs</strong> UTF-8. Wenn wir das nicht erwarten, werden wir unsere Besucher sicher bald frustrieren.</li>
<li>UTF-8 können wir <strong>validieren</strong>: So <a href="http://toscho.de/2009/utf-8-erzwingen/">finden und reparieren</a> wir falsch kodierte Zeichen, ehe der Leser sie sieht.</li>
<li>UTF-8 braucht <strong>kein <abbr title="Byte Order Mark" lang="en">BOM</abbr></strong>. Auch ein Vorteil gegenüber UTF-16 und UTF-32. Anleitung: <a href="http://toscho.de/2009/bom-entfernen/">Bom entfernen</a>.</li>
</ul>
<p>In einigen Programmiersprachen – <a href="http://techblog.notify.me/post/59407777/perl-utf-8-hell-and-how-to-find-your-way-out">Perl</a> oder <a href="http://www.phpwact.org/php/i18n/utf-8">PHP</a> beispielsweise – hängt die Implementierung der Multibytekodierungen noch ein bißchen. Aber mit ein wenig Lektüre können wir auch diese Probleme meistens lösen. Nie entschuldigen <em>sie allein</em> den Verzicht auf UTF-8.</p>
<p>Zu diesem Artikel wurde ich durch zwei Diskussionsbeiträge inspiriert: einen <a href="http://webcache.googleusercontent.com/search?q=cache:e0EdSWPOgDIJ:www.to-date-forum.de/viewtopic.php%3Ff%3D246%26t%3D4203+site:www.to-date-forum.de+doctype+und+zeichenkodierung&amp;cd=1&amp;hl=de&amp;ct=clnk">schlechten</a> und einen <a href="http://groups.google.com/group/de.comm.infosystems.www.authoring.misc/msg/0e782543d0e11096">guten</a>. Der gute stammt von <a href="http://www.bjoernsworld.de/" class="notranslate">Björn Höhrmann</a>, dem ich deshalb ausdrücklich danken will.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/warum-utf-8/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>WordPress: Auszug mit bestimmter Zeichenzahl</title>
		<link>http://toscho.de/2010/wordpress-auszug-zeichenzahl/</link>
		<comments>http://toscho.de/2010/wordpress-auszug-zeichenzahl/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 18:19:35 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Zeichen]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1604</guid>
		<description><![CDATA[Wie man nur eine genau festgelegte Zeichenzahl ausgibt.]]></description>
			<content:encoded><![CDATA[<p>Die Template-Funktion <a hreflang="en" class="notranslate" href="http://codex.wordpress.org/Template_Tags/the_excerpt">the_excerpt()</a> kann in der Menge der auszugebenden Worte <a href="http://dynamicinternet.eu/blog/2009-12-10/verschiedene-excerpt-laengen-mit-wordpress-2-9/">gesteuert</a> werden. Brauchen wir aber eine feste Zeichenzahl, so müssen wir ein bißchen tricksen.</p>
<p>Für einen Kunden, der in drei Sprachen bloggt und bei gleicher Wortmenge oft sehr unterschiedlich lange Auszüge produziert, habe ich einmal diese Extrafunktion geschrieben:</p>
<pre class="notranslate"><i>/**
 * Erzeugt einen Auszug mit genau definierter Zeichenzahl.
 *
 * @param int $chars Menge der Zeichen.
 * @param bool $echo Aus- oder Rückgabe
 * @return string
 */</i>
function excerpt_chars(<var>$chars</var> = 100, <var>$echo</var> = TRUE)
{
    global <var>$post</var>; 

    <var>$out</var> = strip_tags(<var>$post</var>-&gt;post_content);
    <var>$out</var> = substr(<var>$out</var>, 0, (int) $chars);
    <var>$out</var> = <a href="http://toscho.de/2009/php-funktion-end_on_word/">end_on_word</a>(<var>$out</var>) . '<code class="string">&amp;#160;…</code>';
    <var>$out</var> = xwp_autop(<var>$out</var>); 

    if ( <var>$echo</var> )
    {
        echo <var>$out</var>;
        return;
    } 

    return <var>$out</var>;
} 

<i>/**
 * Wandelt Zeilenumbrüche in HTML-Code.
 * wpautop() ist hier nicht nötig
 * @source <a href="http://photomatt.net/scripts/autop">http://photomatt.net/scripts/autop</a>
 * @param string $pee zu formatierender String
 * @param bool $br
 * @return string
 */ </i>
function xwp_autop(<var>$pee</var>, <var>$br</var>=1)
{
    <i>// cross-platform newlines </i>
    <var>$pee</var> = preg_replace("<code class="string">/(\r\n|\n|\r)/</code>", "\n", <var>$pee</var>);
    <i>// take care of duplicates</i>
    <var>$pee</var> = preg_replace("<code class="string">/\n\n+/</code>", "<code class="string">\n\n</code>", <var>$pee</var>);
    // make paragraphs, including one at the end
    <var>$pee</var> = preg_replace('<code class="string">/\n?(.+?)(\n\n|\z)/s</code>', "<code class="string">&lt;p&gt;$1&lt;/p&gt;\n</code>", <var>$pee</var>);
    // optionally make line breaks
    if ($br) <var>$pee</var> = preg_replace('<code class="string">|(?&lt;!&lt;/p&gt;)\s*\n|</code>', "<code class="string">&lt;br /&gt;\n</code>", <var>$pee</var>);
    return <var>$pee</var>;
}</pre>
<p>Diese beiden Funktionen kommen mitsamt der Funktion <a href="http://toscho.de/2009/php-funktion-end_on_word/">end_on_word()</a> in die <code>functions.php</code>.</p>
<p>Im Template wird die Funktion dann anstatt des the_excerpt() benutzt:</p>
<pre class="notranslate"><i>// Die ersten 200 Zeichen</i>
excerpt_chars(200);</pre>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/wordpress-auszug-zeichenzahl/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>PHP: Funktion sanitize_ip</title>
		<link>http://toscho.de/2009/php-funktion-sanitize-ip/</link>
		<comments>http://toscho.de/2009/php-funktion-sanitize-ip/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 18:44:14 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[Zeichen]]></category>
		<category><![CDATA[htaccess]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1534</guid>
		<description><![CDATA[Wie man unvollständige IPv4-Adressen repariert.]]></description>
			<content:encoded><![CDATA[<p><img src="http://toscho.de/wp-content/uploads/2009/09/php-150.png" alt="" width="150" height="150" class="alignright size-full wp-image-1692" />Ich habe mich jetzt entschlossen, neben China auch Südkorea vollständig von dieser Website <a href="http://toscho.de/2009/htaccess-angriffe-sehen-blockieren/" title="Angriffe sehen und blockieren">auszusperren</a>. In den letzten drei Monaten waren 100% aller Zugriffe von dort Hackerversuche. Irgendwann kommt vielleicht einer durch; darauf will ich nicht warten.</p>
<p>Bei <a href="http://www.ipaddresslocation.org/ip_ranges/get_ranges.php">ipaddresslocation.org</a> oder <a href="http://www.proxyserverprivacy.com/ipaddress_range.php">proxyserverprivacy.com</a> bekommt man Listen aller IP-Adressen, die zu einem Land gehören. Die muß man jetzt nur in die <a href="http://de.wikipedia.org/wiki/Classless_Inter-Domain_Routing" title="Classless Inter-Domain Routing">CIDR-Notation</a> konvertieren; damit die .htaccess einigermaßen übersichtlich bleibt.</p>
<p>Ich habe mir dazu ein kleines Script geschrieben, das ihr gerne benutzen dürft: <a href="http://labs.toscho.de/ip-to-cidr/">IP-Adressen nach CIDR konvertieren</a>. Dort stehen ein Beispielcode zum Ansehen und fertige Listen für China und Südkorea zum Download.</p>
<p>Beim Zusammenstecken des Formulares ist mir aufgefallen, daß die Filterfunktionen in PHP zwar ein »<a href="http://de3.php.net/manual/en/filter.filters.sanitize.php">sanitize</a>« für alle möglichen Datentypen mitbringen, nicht aber für <a href="http://de.wikipedia.org/wiki/IPv4">IPv4</a>.</p>
<p>Ich brauchte eine Funktion, die aus <samp>127.0.</samp> ein <samp>127.0.0.0</samp> macht, weil ich manche Blöcke bisher über gekürzte IP-Adressen gesperrt habe.</p>
<pre class="notranslate"><i>/**
 * Repariert unvollständige IPv4-Adressen.
 * Usage:
 *      sanitize_ip(&#039;127.0&#039;);
 * Result:
 *      string(9) &quot;127.0.0.0&quot;
 * @param string $ip
 * @return string
 */</i>
function sanitize_ip(<var>$ip</var>)
{
    <i>// Standardverhalten plus Punkt.</i>
    $ip = trim(<var>$ip</var>, &quot;<code class="string">\n\r\t\x0B\0. </code>&quot;);

    if ( ! preg_match(&#039;<code class="string">~(\d+\.?)*~</code>&#039;, <var>$ip</var>) )
    {   <i>// Hat nicht die Form 127.0 oder 127.0.0.
        // Man könnte auch alle falschen Zeichen rauswerfen,
        // aber das wäre zu … weich.</i>
        return FALSE;
    }
    <i>// Mehrfache Punkte entfernen.</i>
    $ip    = preg_replace(&#039;<code class="string">~(\.)+~</code>&#039;, &#039;<code class="string">.</code>&#039;, <var>$ip</var>);
    <i>// In Abschnitte zerlegen.</i>
    <var>$parts</var> = explode(&#039;<code class="string">.</code>&#039;, <var>$ip</var>);
    <i>// Wieviele haben wir eigentlich?</i>
    <var>$c</var>     = count(<var>$parts</var>);
    <i>// Fehlende Abschnitte mit 0 ergänzen.</i>
    for(<var>$i</var> = 4 - <var>$c</var>; <var>$i</var> &gt; 0; <var>$parts[]</var> = 0, <var>$i</var>-- );
    <i>// Zusammensetzen und raus damit.</i>
    return implode(&#039;<code class="string">.</code>&#039;, <var>$parts</var>);
}</pre>
<p>Das kann man sicher noch verfeinern. Vorschläge nehme ich gerne entgegen.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2009/php-funktion-sanitize-ip/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Designlinks 8</title>
		<link>http://toscho.de/2009/designlinks-8/</link>
		<comments>http://toscho.de/2009/designlinks-8/#comments</comments>
		<pubDate>Mon, 24 Aug 2009 10:09:14 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Browser]]></category>
		<category><![CDATA[Links]]></category>
		<category><![CDATA[Markup]]></category>
		<category><![CDATA[Typographie]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[Zeichen]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1523</guid>
		<description><![CDATA[Zurückstrahlende Überwachungskameras, eine gefahrene Schrift, Mikrodaten, Phreaker, ein Rückblick auf 1984 und mehr.]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://www.heise.de/newsticker/Gutachter-Vorratsdatenspeicherung-bringt-lueckenlose-raeumliche-Ueberwachung--/meldung/141192">Vorratsdatenspeicherung</a>, <a href="http://www.main-spitze.de/region/ruesselsheim/print_6809397.htm">erzwungene DNS-Tests</a>, Bundestrojaner und <a href="http://www.zeit.de/online/2009/34/iphone-app-spyware">geschwätzige iPhones</a> – <a href="http://www.heise.de/newsticker/Kanzlerin-Merkel-als-Opfer-von-Videoueberwachung--/meldung/71316">niemand</a> darf sich heute noch sicher fühlen.<br />
Eine schöne gestalterische Antwort darauf hat das Team <a href="http://www.antrepo4.com/">antrepo4.com</a> gefunden: die <a href="http://www.a2591.com/2009/08/im-not-security-camera.html">Spoticam</a>.</p>
<p class="wideimg"><img src="http://toscho.de/wp-content/uploads/2009/08/spoticam.jpg" alt="Spoticam" title="Spoticam" width="600" height="600" class="size-full wp-image-1524" /></p>
</li>
<li>Kameras können Designer nicht nur inspirieren, sondern ihnen auch helfen, eine Schrift zu gestalten, hier den <a href="http://nl.toyota.be/cars/new_cars/iq/iq_font.aspx">iQ-Font</a>:
<p><object width="500" height="281"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5233789&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=5233789&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="500" height="281"></embed></object></li>
<li>Einen ganz anderen Weg zur Schrift hat <a href="http://blog.foolip.org/">Philip Jägenstedt</a> eingeschlagen: Auf der Suche nach einem besseren Format für chinesische Schriften hat er bei Opera dessen internes SVG-Toolkit erweitert und ein Konzept entwickelt, das er <a href="http://liu.diva-portal.org/smash/record.jsf?pid=diva2:18417"><i lang="en">Stylized Stroke Fonts</i> (SSF)</a> nennt.</li>
<li>Vom gleichen Autor empfehle ich den Text »<a href="http://blog.foolip.org/2009/08/23/microformats-vs-rdfa-vs-microdata/">Microformats vs RDFa vs Microdata</a>«. Hier werden die drei unterschiedlichen Modelle mal anhand eines Praxisbeispiels verglichen.
<p>Letzten Endes ist er bei den <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/microdata.html">Microdaten aus HTML 5</a> hängengeblieben – ein Konzept, vor dem ich ob seiner »vorläufigen« Anmutung bisher eher zurückschrecke. Jetzt reizt es mich aber doch.</li>
<li>SVG aber leidet immer noch unter der dünnen Unterstützung durch den Internet Explorer: Ohne Plugin sehen dessen Nutzer nichts. Das möchten die Betreiber des Projektes <a href="http://code.google.com/p/svgweb/">SVG Web</a> mittels Javascript und Flash lösen. Sicher ein interessanter Ansatz; nur die dafür nötigen 150 KiB finde ich ein bißchen viel.</li>
<li>Simon Willison hat über den richtigen MIME-Typen für <a href="http://www.json.org/">JSON-Dateien</a> nachgedacht: <a lang="en" href="http://simonwillison.net/2009/Feb/6/json/">Pragmatism, purity and JSON content types</a>.<br />
Kurzfassung: Das in <a href="http://www.ietf.org/rfc/rfc4627.txt">RFC 4672</a> definierte <code>application/json</code> gebrauche man nur in Ausnahmefällen. Spannende Kommentare.</li>
<li>Wem Kompatibilität ebenso wichtig ist wie Simon Willison, der sollte sich mal gründlich die <a href="http://blogs.msdn.com/ieinternals/archive/2009/08/20/WinINET-IE-Cookie-Internals-FAQ.aspx">Internet Explorer Cookie Internals</a> von Eric Lawrence durchlesen.
<p>Eine bessere Ressource dafür wird man so schnell nicht finden, denn:</p>
<blockquote><p>Internet Explorer (including IE8) does not attempt to support any RFC for cookies.</p></blockquote>
<p>Auf dieser Seite poppt bei mir irgendwann eine Paßwortanfrage auf. Kann das jemand nachvollziehen?</li>
<li>Kompatibilitätsprobleme hat nicht nur der Internet Explorer; sie treten in jedem größeren Projekt auf. Dazu habe ich eine sehr <a href="http://www.projectcartoon.com/cartoon/27">treffende Illustration</a> gefunden.</li>
<li>Andere Leute nutzen ihr Talent weniger … produktiv. David Kushner erzählt in »<a href="http://www.rollingstone.com/news/story/29787673/the_boy_who_heard_too_much/print">The Boy Who Heard Too Much</a>« eindringlich die Geschichte eines blinden Jungen, der sein Gehör für ungewöhnliche Telefonhacks genutzt hat.</li>
<li>Ebenso kurzsichtig, wenngleich mit weniger drastischen Konsequenzen, zeigte sich die Stiftung Warentest, als sie 1984 <a href="http://www.atari-computermuseum.de/warentest.htm">über »Homecomputer« schrieb</a>:<br />
<blockquote><p>Obwohl es ein Hauptziel unseres Tests war, herauszufinden, welche heimischen Anwendungsgebiete es für einen Computer geben könnte, sind wir in monatelangen Prüfungen nicht fündig geworden.</p></blockquote>
<p>Ich mag die unfreiwillige Komik, die <em>rückblickend</em> immer dann entsteht, wenn jemand versucht, die aktuelle Technik in die Zukunft zu extrapolieren. Auch unsere eigenen Texte werden irgendwann so wirken. Ein Gedanke, der mir hilft, mich nicht übermäßig ernst zu nehmen …</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2009/designlinks-8/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Authentifizierung mit PHP und UTF-8</title>
		<link>http://toscho.de/2009/authentifizierung-php-utf-8/</link>
		<comments>http://toscho.de/2009/authentifizierung-php-utf-8/#comments</comments>
		<pubDate>Fri, 12 Jun 2009 23:18:25 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Sicherheit]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[Zeichen]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[UTF-8]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1184</guid>
		<description><![CDATA[Umlaute in Nutzernamen und Paßwörtern? Mit PHP hat man immerhin eine Chance, dies zu erlauben.]]></description>
			<content:encoded><![CDATA[<p>Beim einfachen Paßwortschutz mit den Bordmitteln des Webservers Apache – den Dateien .htpasswd und .htaccess – stößt man bald auf ein sehr ekelhaftes Problem: Umlaute kodiert jeder Browser anders.<br />
Und man kann per HTTP keine Kodierung vorschlagen, denn die Authentifzierungsheader werden früher versandt als die Angabe des Content-Typs, der ja erst im Charset-Parameter die Zeichenkodierung angibt.</p>
<p>Opera benutzt UTF-8, Firefox und Internet Explorer aber verwenden die Zeichenkodierung, die als lokaler Rückfallwert eingestellt wurde, auf einem deutschsprachigen System also meistens ISO-8859-1.</p>
<p>Der Apache kann – soweit ich weiß – nicht automatisch erkennen, ob eine Zeichenkette in UTF-8 kodiert wurde. Und diese Kette entsprechend umzuwandeln geht dann vollends über seine Fähigkeit und Kompetenz hinaus.</p>
<p>Mit PHP hingegen ist das <a href="http://toscho.de/2009/utf-8-erzwingen/">sehr leicht möglich</a>, wenn es als Modul arbeitet und nicht per CGI.<br />
Hier will ich mal eine einfache Methode vorstellen, Umlaute in Benutzernamen und Paßwörtern zu erlauben. Ich habe diesen Code 2005 geschrieben; etwas später habe ich ihn auf PHP 5 umgestellt, und seither verwende ich ihn immer wieder in kleinen Projekten.<br />
Die Funktionen <code>is_utf8_compatible()</code> und <code>force_utf8()</code> sollten in einer separaten Klasse liegen; ich habe sie hier nur der Übersichtlichkeit halber direkt in die Authentifizierungsklasse gesetzt.<br />
Im ZIP-Archiv liegt auch eine Datei, die den praktischen Einsatz demonstriert.</p>
<p class="downloadlink">Download: <a class='piwik_download' href='http://toscho.de/wp-content/uploads/2009/06/auth.zip'>PHP-Klasse: HTTP_Auth</a>.</p>
<p>Um die Diskussion zu erleichtern, sei hier der Quellcode im Original wiedergegeben:</p>
<h2>class HTTP_Auth</h2>
<pre>&lt;?php
<i>/**
 * Sendet Authentifizierungsheader
 *
 * @category HTTP
 * @author   Thomas Scholz &lt;<a href="http://toscho.de">http://toscho.de</a>&gt;
 * @version  1.0.1 (10.06.2009)
 * @access   public
 */</i>

class HTTP_Auth {

    <i>/**
     * Texte
     */</i>
    private <var>$messages</var> = array(
        'realm'          =&gt; 'Passwortschutz!',
        'wrong_name'     =&gt; 'Der Nutzername stimmt nicht.',
        'no_password'    =&gt; 'Bitte geben Sie Ihr Passwort ein.',
        'wrong_password' =&gt; 'Das Passwort stimmt nicht.',
        'login_failed'   =&gt; 'Tja, Pech!&lt;br&gt;Zur &lt;a href="/"&gt;Startseite&lt;/a&gt;.&lt;/p&gt;'
        );

    <i>/* Constructor */</i>
    public function __construct()
    {
        <i>/* Nichts zu tun. */</i>
    }

    public function set_message(<var>$name</var>, <var>$text</var>)
    {
        <var>$this-&gt;messages[$name]</var> = <var>$text</var>;
    }

    <i>/**
     * Prüft Nutzernamen und -paßwort
     * @param array <var>$array_users</var> Array aus name =&gt; password je in md5()
     * @return boolean
     */</i>
    public function is_authuser(<var>$array_users</var>)
    {
        if ( !isset ( <var>$_SERVER['PHP_AUTH_USER']</var> ) )
        {
            $this-&gt;require_auth(<var>$this-&gt;messages['realm']</var>);
        }
        else
        {
            <var>$name</var> = md5( $this-&gt;force_utf8(<var>$_SERVER['PHP_AUTH_USER']</var>) );

            if ( !array_key_exists(<var>$name</var>, <var>$array_users</var>) )
            {
                $this-&gt;require_auth(<var>$this-&gt;messages['wrong_name']</var>);
            }
            if ( !isset (<var>$_SERVER['PHP_AUTH_PW']</var>) )
            {
                $this-&gt;require_auth(<var>$this-&gt;messages['no_password']</var>);
            }
            elseif ( <var>$array_users[$name]</var> != md5(
                    $this-&gt;force_utf8(<var>$_SERVER['PHP_AUTH_PW']</var>) )
                )
            {
                $this-&gt;require_auth(<var>$this-&gt;messages['wrong_password']</var>);
            }
            else
            {
                return TRUE;
            }
        }
    }

    <i>/**
     * Sendet Authentifizierungsheader.
     * @param string <var>$realm</var> Nachrichtentext
     * @return string
     */</i>
    public function require_auth($realm)
    {
        header('WWW-Authenticate: Basic realm="' . <var>$realm</var> . '"');
        header('HTTP/1.0 401 Unauthorized');
        echo <var>$this-&gt;messages['login_failed']</var>;
        exit;
    }
    <i>/**
     * Prüft einen String auf UTF-8-Kompatibilität.
     * RegEx von Martin Dürst
     * @source <a href="http://www.w3.org/International/questions/qa-forms-utf-8.html">http://www.w3.org/International/questions/qa-forms-utf-8.html</a>
     * @see <a href="http://toscho.de/2009/utf-8-erzwingen/">http://toscho.de/2009/utf-8-erzwingen/</a>
     * @param string <var>$str</var> String to check
     * @return boolean
     */</i>
    public function is_utf8_compatible(<var>$str</var>)
    {
        return preg_match("/^(
              [\x09\x0A\x0D\x20-\x7E]            <i># ASCII</i>
            | [\xC2-\xDF][\x80-\xBF]             <i># non-overlong 2-byte</i>
            |  \xE0[\xA0-\xBF][\x80-\xBF]        <i># excluding overlongs</i>
            | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  <i># straight 3-byte</i>
            |  \xED[\x80-\x9F][\x80-\xBF]        <i># excluding surrogates</i>
            |  \xF0[\x90-\xBF][\x80-\xBF]{2}     <i># planes 1-3</i>
            | [\xF1-\xF3][\x80-\xBF]{3}          <i># planes 4-15</i>
            |  \xF4[\x80-\x8F][\x80-\xBF]{2}     <i># plane 16</i>
            )*$/x",
            <var>$str</var>);
    }
    <i>/**
     * Versucht, einen String nach UTF-8 zu konvertieren.
     *
     * @param string <var>$str</var> Zu kodierender String
     * @param string <var>$inputEnc</var> Vermutete Kodierung des Strings
     * @return string
     */</i>
    function force_utf8(<var>$str</var>, <var>$inputEnc</var>='WINDOWS-1252')
    {
        if ( $this-&gt;is_utf8_compatible(<var>$str</var>) )
        {
            <i>// Nichts zu tun.</i>
            return <var>$str</var>;
        }

        if ( strtoupper(<var>$inputEnc</var>) == 'ISO-8859-1')
        {
            return utf8_encode(<var>$str</var>);
        }

        if ( function_exists('mb_convert_encoding') )
        {
            return mb_convert_encoding(<var>$str</var>, 'UTF-8', <var>$inputEnc</var>);
        }

        if ( function_exists('iconv') )
        {
            return iconv(<var>$inputEnc</var>, 'UTF-8', <var>$str</var>);
        }

        else
        { <i>/* GAU! */</i>
            return <var>$str</var>;
        }
    }
}</pre>
<p>Eine Nutzerverwaltung gehört natürlich in separaten Code, denn sie sollte vom Authentifizierungsverfahren unabhängig sein.<br />
Ich habe hier <a href="http://de.wikipedia.org/wiki/Message-Digest_Algorithm_5">MD5-Hashwerte</a> verwendet – diese gelten nicht mehr als sicher. Je nach Sicherheitsanforderung sollte man also einen anderen Algorithmus benutzen oder besser eine ganz andere Authentifizierungsmethode. Denn bei der hier vorgestellten Variante werden Nutzername und Paßwort im Klartext an den Webserver gesandt. Wenn <em>das</em> ein Problem ist, dann dürfte die Erzeugung des Hashwertes die kleinste Sorge sein …</p>
<h2>Anwendungsbeispiel <code>example.php</code></h2>
<p>Hier wird hoffentlich klar, daß es ausreicht, nur die Hashwerte der Namen und Paßworte auf dem Server zu speichern – die Klasse arbeitet allein damit, muß die Originale also nicht kennen. Generell gilt: Speichere niemals Paßwörter im Klartext! Nicht in der Datenbank, nicht im PHP-Skript und auch nicht in Textdateien.</p>
<pre>&lt;?php
require_once 'class.HTTP_Auth.php';
header ("Content-Type: text/html;charset=utf-8");

<var>$auth</var> = new HTTP_Auth;

<var>$users</var> = array(
        <i>// 'ö'   =&gt; 'ßüß'</i>
        'a172480f4e21d0a124bac19c89569c59'      =&gt; '994510e17c01e8680c3147df0c8ea605',
        <i>// So lieber nicht!</i>
        md5('Gröfaz') =&gt; md5('Laß mich rein!')
    );
if ( $auth-&gt;is_authuser(<var>$users</var>) )
{
    echo '&lt;p style="padding: 20%; font:2em/1.5 serif"&gt;Hallo &lt;b&gt;'
        . $auth-&gt;force_utf8(<var>$_SERVER['PHP_AUTH_USER']</var>)
        . '&lt;/b&gt;, dein Passwort ist &lt;b&gt;'
        . $auth-&gt;force_utf8(<var>$_SERVER['PHP_AUTH_PW']</var>)
        . '&lt;/b&gt;!&lt;/p&gt;';
}</pre>
<h2>Einschränkungen</h2>
<p>In Deutschland leben etwa <a href="http://www.statistik-portal.de/Statistik-Portal/de_jb01_jahrtab2.asp">7 Millionen Ausländer</a> oder Menschen mit einer anderen Muttersprache als Deutsch.<br />
Wer Türkisch als Muttersprache hat, wird die Daten vielleicht in ISO-8859-9 kodieren, wer vorrangig Russisch spricht, ISO-8859-2 – <a href="http://toscho.de/2008/grundlagen-zeichenkodierung/#toc-die-iso-8859-gruppe" title="Übersicht sprachspezifischer Zeichenkodierungen">und so weiter</a>. Da die übertragenen Daten zu kurz für eine automatische Erkennung sind, scheitert der hier vorgestellte Weg notwendig an solchen Problemen.</p>
<p>Der Zugriff auf Nicht-PHP-Dateien ist immer noch ohne Kontrolle möglich. Hierbei hat der Schutz per Server klar die Nase vorne. Man könnte natürlich <em>sämtliche Aufrufe</em> im zu schützenden Verzeichnis über das PHP-Skript schicken. Das finde ich aber nicht sehr … praktisch.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2009/authentifizierung-php-utf-8/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>BOM entfernen (ï»¿)</title>
		<link>http://toscho.de/2009/bom-entfernen/</link>
		<comments>http://toscho.de/2009/bom-entfernen/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 15:47:56 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Trickkiste]]></category>
		<category><![CDATA[Zeichen]]></category>
		<category><![CDATA[BOM]]></category>
		<category><![CDATA[ISO-8859-1]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[UTF-8]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=830</guid>
		<description><![CDATA[Eine genaue Anleitung für Windows, Linux und Mac OS X.]]></description>
			<content:encoded><![CDATA[<p>Wie wir wissen, ist UTF-8 <em>die</em> <a href="http://toscho.de/2008/grundlagen-zeichenkodierung/">Zeichenkodierung</a> im Internet. Viele Editoren speichern Dokumente in UTF-8 aber mit einem <a href="http://toscho.de/2009/zeichenkodierung-angeben/#toc-bom">BOM</a> (<i lang="en">Byte Order Mark</i>), was zu erheblichen Problemen führen kann, wenn wir die Datei etwa per <a href="http://toscho.de/thema/php/">PHP</a> in eine andere einbinden.</p>
<h2>Finden</h2>
<p>Ob eine Datei überhaupt ein BOM hat, kann man festellen, indem man sie sich mit einem <a href="http://de.wikipedia.org/wiki/Hex-Editor">Hex-Editor</a> ansieht. Ein BOM sieht darin so aus: <code>EFBBEF</code>. Das können wir hier gleich löschen – und den Rest dieses Artikels überspringen. Manche Editoren versauen dann aber die komplette Datei (PSPad beispielsweise), deshalb seien hier noch andere Wege genannt.</p>
<p>Wer sich zum Betrachten keine zusätzliche Software installieren möchte, kann die Datei auch einfach im Browser öffnen und die Zeichenkodierung der Ausgabe manuell auf ISO-8859-1 festsetzen. Steht ganz oben <code>ï»¿</code>, haben wir ein BOM erwischt.</p>
<p>Online: <a href="http://people.w3.org/rishida/utils/bomtester/">UTF-8 BOM tester</a>.</p>
<h2>Entfernen</h2>
<p>Gut, wir haben das BOM entdeckt – jetzt müssen wird es irgendwie loswerden.</p>
<h3>Linux und Mac OS X</h3>
<p>Hier ist es ganz einfach: Wir öffnen die Datei in <a href="http://www.vim.org/">Vim</a>, geben <kbd>:set nobomb</kbd> ein und speichern sie. Fertig.</p>
<h3>Windows</h3>
<p>Mit Bordmitteln werden wir das BOM – soweit ich weiß – nicht los. Spätestens jetzt müssen wir einen zusätzlichen Editor benutzen, beispielsweise <a href="http://notepad-plus.sourceforge.net/de/site.htm">Notepad++</a>: Öffnen, unter <em>Format</em> »UTF-8 ohne BOM« einstellen, speichern, fertig.<br />
Für dieses Programm gibt es auch ein <a href="http://sourceforge.net/project/showfiles.php?group_id=189927&#038;package_id=222593">Hex-Editor-Plugin</a>; damit können wir gleich prüfen, ob es geklappt hat.</p>
<p>Ein Tip von <a href="http://borumat.de/">Andreas Borutta</a>: Christoph Schneegans bietet ein <a href="http://schneegans.de/frontpage/utf-8/">VB-Script zum Entfernen des BOMs</a> an. Auf der Seite ganz unten die Datei <code>delete-utf8-bom.vbs</code> herunterladen, auf dem Desktop ablegen und die »bomifizierte« Datei mit der Maus draufziehen – fertig.</p>
<hr />
<p>In jedem brauchbaren Editor kann man einstellen, daß alle Dateien oder nur bestimmte Dateitypen als UTF-8 ohne BOM gespeichert werden. Wenn dein Editor das nicht anbietet, dann <em>wirf ihn weg</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2009/bom-entfernen/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Typographie-Blogs</title>
		<link>http://toscho.de/2009/typographie-blogs/</link>
		<comments>http://toscho.de/2009/typographie-blogs/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 16:23:27 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[Typographie]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[Zeichen]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=790</guid>
		<description><![CDATA[Sieben Typo-Blogs kurz vorgestellt. ]]></description>
			<content:encoded><![CDATA[<p><img src="http://toscho.de/wp-content/uploads/2009/04/anfuehrungszeichen.png" alt="Vergleich Verdana und Minion Web Pro" title="Anführungszeichen" width="200" height="100" class="alignright size-full wp-image-792 border" />Zur <a href="http://toscho.de/thema/typographie/">Typographie</a> bin ich erst vor etwa acht oder neun Jahren gekommen. Damals habe ich entdeckt, daß die „deutschen“ Anführungszeichen in Verdana kaputt sind. Ich bin dann auf <a href="http://toscho.de/2009/guillemet-kein-pfeil/">Guillemets</a> umgestiegen, und wenig später habe ich die Verdana komplett aus meinem typographischen Werkzeugkasten verbannt. Aber dazu schreibe ich mal einen separaten Artikel …</p>
<p>Seither versuche ich, einigermaßen auf dem aktuellen Stand zu bleiben. Ich lerne, und ich suche nach Inspiration. Dabei helfen mir ein paar Weblogs, die ich heute mal vorstellen will.</p>
<h2>Richard Rutter: The Elements of Typographic Style Applied to the Web</h2>
<p><a href="http://www.webtypography.net/"><img src="http://toscho.de/wp-content/uploads/2009/04/webtypographynet.png" alt="webtypography.net" title="webtypography.net" width="250" height="188" class="alignright size-full wp-image-798 border" /></a>Leser dieses Blogs kennen Richard Rutter spätestens seit meinem Artikel über das <a href="http://toscho.de/2009/mythos-font-size-62dot5-prozent/">Problem ignorierter Mindestschriftgrößen</a>. Auf <a href="http://www.webtypography.net/">webtypography.net</a> schreibt er seit 2004 ein Handbuch zur Webtypographie, das ich jedem dringend als Lektüre empfehlen möchte.</p>
<p>Eigentlich ist es kein Blog, aber da die Seite einen (leider gekürzten) Newsfeed hat und einigermaßen regelmäßig mit frischem Inhalt versorgt wird, nehme ich mir die Freiheit, meine Liste damit zu beginnen. Englisch.</p>
<p>Lesetip: <a href="http://www.webtypography.net/Rhythm_and_Proportion/Horizontal_Motion/2.1.3/">Set ragged if ragged setting suits the text and page</a>. Warum Blocksatz eine Sünde ist.</p>
<h2>Jürgen Siebert c/o FontShop AG: Fontblog</h2>
<p><a href="http://www.fontblog.de/"><img src="http://toscho.de/wp-content/uploads/2009/04/fontblogde.png" alt="fontblog.de" title="fontblog.de" width="250" height="188" class="alignright size-full wp-image-802 border" /></a>Ein »Firmenblog«, das über neue Schriften, Wettbewerbe und kleine Alltagsgeschichten berichtet. Für mich vorrangig eine Linkquelle. Volltextfeed, deutsch.</p>
<h2 style="clear:right;">John D Boardley: I love typography</h2>
<p><a href="http://ilovetypography.com/"><img src="http://toscho.de/wp-content/uploads/2009/04/ilovetypographycom.png" alt="ilovetypography.com" title="ilovetypography.com" width="250" height="188" class="alignright size-full wp-image-803 border" /></a>Einmal pro Woche kann man sich hier eine mit Links und und Nachrichten eindecken, die bequem für zwei Wochen reichen. Zwischendurch gute Artikel zu Spezialfragen und zur Terminologie.<br />
Lesetip: <a href="http://ilovetypography.com/2007/08/26/who-shot-the-serif-typography-terms/">Who shot the serif?</a>. Volltextfeed, englisch.</p>
<h2>Stephen Coles: Typographica</h2>
<p><a href="http://typographica.org/"><img src="http://toscho.de/wp-content/uploads/2009/04/typographicaorg.png" alt="typographica.org" title="typographica.org" width="250" height="188" class="alignright size-full wp-image-809 border" /></a>Hier wird über Schriften und Bücher berichtet … allerdings ist die Aktualisierungsrate inzwischen bei Infraschall angelangt. Volltextfeed, englisch.</p>
<h2 style="clear:right;">FontShop: The FontFeed</h2>
<p><a href="http://fontfeed.com/"><img src="http://toscho.de/wp-content/uploads/2009/04/fontfeedcom.png" alt="fontfeed.com" title="fontfeed.com" width="250" height="188" class="alignright size-full wp-image-811 border" /></a>Stephen Coles schreibt auch hier, gemeinsam mit Jürgen Siebert, Yves Peters und Erik Spiekermann. Ein hochkarätiger Autorenstamm, der uns mit News, Links und Inspiration versorgt. Hin und wieder auch mal ein schöner Technikartikel wie dieser: <a href="http://fontfeed.com/archives/styles-weights-widths-it’s-all-in-the-type-family/">Styles, Weights, Widths — It’s All in the (Type) Family</a>.<br />
Leider nur mit kastriertem Feed, englisch.</p>
<h2>Erik Spiekermann: SpiekerBlog</h2>
<p><a href="http://spiekermann.com/"><img src="http://toscho.de/wp-content/uploads/2009/04/spiekermanncom.png" alt="spiekermann.com" title="spiekermann.com" width="250" height="188" class="alignright size-full wp-image-814 border" /></a>Typographie wird nicht nur von Menschen genutzt – sie wird auch von ihnen <em>gemacht</em>. Spiekermann vermittelt die persönliche Note mit viel Humor und der Gelassenheit eines Mannes, der wirklich nichts mehr beweisen muß. Volltextfeed, deutsch.</p>
<h2 style="clear:right;">Christoph Koeberlin: Typefacts</h2>
<p><a href="http://typefacts.com/"><img src="http://toscho.de/wp-content/uploads/2009/04/typefactscom.png" alt="typefacts.com" title="typefacts.com" width="250" height="188" class="alignright size-full wp-image-816 border" /></a>Noch ganz frisch ist Christoph Koeberlins Blog Typefacts. Laßt euch vom englischen Titel nicht ablenken: Christoph schreibt klares Deutsch. In die Artikel hat er kleine interaktive Tests eingebaut, die ich wirklich mag. Und da seine Texte ein paar meiner Entwürfe inhaltlich »umzingeln«, fühle ich mich <em>angenehm</em> unter Druck gesetzt …<br />
Auf meine Bitte hin gibt es jetzt auch einen Volltextfeed.</p>
<hr />
<p>Dies ist natürlich nur eine kleine Auswahl. Ich habe mich auf Webseiten mit dem Schwerpunkt »Typographie« konzentriert, die man auch per Feed lesen kann. Eure Tips?</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2009/typographie-blogs/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Database Caching using disk: basic
Object Caching 628/767 objects using disk: basic

Served from: toscho.de @ 2012-05-21 16:07:23 -->
