PHP WTF #7

Direkt entliehen von hier und ein schönes Beispiel für PHPs Handling mit Unicode-Zeichen:

<meta charset="utf8">
<?php
$a = 'äa';
echo "with space: " . $a[0] . " " . $a[1] . "<br />";  //� �
echo "without space: " . $a[0] . $a[1] . "<br />"; //ä

bzw. analog dazu:

<meta charset="utf8">
<?php
$a = 'äa';
echo "substr 0,1: " . substr($a, 0, 1) . "<br />"; //�
echo "substr 0,2: " . substr($a, 0, 2) . "<br />"; //ä

Klar: Das ä belegt 2 Byte:

<?php
$a = 'äa';
echo "strlen: " . strlen($a) . "<br />"; //3
echo "mb_strlen: " . mb_strlen($a, "UTF-8") . "<br />"; //2

Schon besser:

<meta charset="utf8">
<?php
$a = 'äa';
echo "mb_substr 0,1: " . mb_substr($a, 0, 1, "UTF-8") . "<br />"; //ä
echo "mb_substr 0,2: " . mb_substr($a, 0, 2, "UTF-8") . "<br />"; //äa

Mir war das zwar im Prinzip schon alles klar, durch so ein Beispiel wird aber nochmal deutlich, dass man die nicht-mb_* – Funktionen partout meiden sollte.

Weitere Posts:

Dieser Beitrag wurde unter php, PHP-WTF, webdev veröffentlicht. Setze ein Lesezeichen auf den Permalink.

4 Antworten auf PHP WTF #7

  1. Oliver sagt:

    Ich mach sicherheitshalber immer mb_internal_encoding("utf-8");, aber dafür muss man auch einen Editor haben, der UTF-8 schreibt. :-)

  2. david sagt:

    Gute Ergänzung, danke.

    encoding is the character encoding name used for the HTTP input character encoding conversion, HTTP output character encoding conversion, and the default character encoding for string functions defined by the mbstring module.

    Kann man sich immerhin das wiederholte „UTF-8“ als letzten Parameter der mb_* – Funktionen sparen.

  3. Michael Rüfenacht sagt:

    Falls man code hat der auf den str Funktionen basiert kann man diese via .ini mit den mb_str funktionen überladen mit mbstring.func_overload = 1 siehe http://ch.php.net/manual/de/mbstring.configuration.php . Das kann eine Menge Refactoring ersparen.

  4. Pingback: UTF-8 für PHP-Programmierer und Webanwendungen | David Müller: Webarchitektur

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.