UTF-8 nur bei Strings, nicht bei einzelnen Zeichen?!
Sven
- php
1 Tom0 Sven
1 Sven Rautenberg
Hallo,
ich habe hier ein merkwürdiges Problem. Angenommen ich habe folgenden String:
$text = "„Übersicht”";
Wenn ich diesen String ausgebe, erhalte ich „Übersicht”, also alles in bester Ordnung. Möchte ich aber nur ein bestimmtes Zeichen ausgeben und ist dieses zufällig ein Sonderzeichen, wie z.B. so:
echo $text[0];
dann bekomme ich nur ein Fragezeichen ... Mit Buchstaben klappt es wunderbar (bis auf Umlaute), nur eben nicht mit Sonderzeichen.
Hat jemand eine Ahnung, was das sein kann? Die Ausgabe erfolgt in einem normalen XHTML-Gerüst, mit Angabe von header('content-type: text/html; charset=utf-8');
Hello,
$text = "„Übersicht”";
Wenn ich diesen String ausgebe, erhalte ich „Übersicht”, also alles in bester Ordnung. Möchte ich aber nur ein bestimmtes Zeichen ausgeben und ist dieses zufällig ein Sonderzeichen, wie z.B. so:
echo $text[0];
dann bekomme ich nur ein Fragezeichen ... Mit Buchstaben klappt es wunderbar (bis auf Umlaute), nur eben nicht mit Sonderzeichen.
Das ist das Problem der Umstellung von einer Single-Byte-Codierung auf eine Multi-Byte-Codierung.
Alle Zugriffsmethoden, die auf dieser "unteren" Ebene stattfinden, klappen nicht mehr.
Mit $text[0] greifst Du tatsächlich auf der Byte-Ebene zu und erwischst dadurch nur einen Teil des Codes.
vergleiche mal strlen($text) und mb_strlen($text)
http://de2.php.net/manual/de/function.mb-strlen.php
Nicht umsonst gibt es schon etliche Multibyte-Funktionen in PHP.
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Danke Sven und Tom, das hat geholfen!
Moin!
ich habe hier ein merkwürdiges Problem. Angenommen ich habe folgenden String:
$text = "„Übersicht”";
Wenn ich diesen String ausgebe, erhalte ich „Übersicht”, also alles in bester Ordnung. Möchte ich aber nur ein bestimmtes Zeichen ausgeben und ist dieses zufällig ein Sonderzeichen, wie z.B. so:
echo $text[0];
Damit gibst du das erste Byte aus. UTF-8-Zeichen bestehen aber aus einem bis vier Bytes. Du müßtest also eine Erkennungsroutine schreiben, die prüft, ob das auszugebende Byte Bestandteil eines Mehrbyte-Zeichens ist (das ist recht einfach, weil solche Bytes in UTF-8 das Bit 7 gesetzt haben), und dann alle zugehörigen Bytes links und rechts davon ebenfalls mit ausgeben.
Alternativ benutzt du einfach mb_substr(), die Multibyte-Variante von substr(). Das dürfte deutlich einfacher sein.
- Sven Rautenberg