Ich habe eine Zeichenfolge mit Umlauten in utf-8 und es wird ok angezeigt:

var_dump($content);

Es gibt mir "höst lanseras" zurück. Aber wenn ich das versuche:

for ($i = 0; $i < strlen($content) - 1; $i++) {
    var_dump($content[$i]);
}

Ich habe das:

string(1) "h"
string(1) "o"
string(1) "�"
string(1) "�"
string(1) "s"
string(1) "t"
string(1) " "
string(1) "l"
string(1) "a"
string(1) "n"
string(1) "s"
string(1) "e"
string(1) "r"
string(1) "a"
string(1) "s"

Wie bekomme ich ein Umlautsymbol als Element eines Arrays?

1
Kleyton 23 Dez. 2015 im 01:44

2 Antworten

Beste Antwort

In UTF-8 wird "ö" mit mehr als einem Byte codiert.
PHP-Strings sind dumme Byte-Arrays. PHP kennt überhaupt keine "Zeichen" oder ähnliches.
Der Zugriff auf String-Offsets mit $str[x] greift auf ein bestimmtes Byte zu. strlen gibt die Länge in Bytes an, nicht in "Zeichen".

Alles zusammen ergibt das Ergebnis, dass Sie auf einzelne Bytes anstatt auf Zeichen zugreifen und im Fall von "ö" die Hälfte eines Zeichens / unsinnige Bytes ausgeben.

Verwenden Sie die Funktionen mb_, um Zeichenfolgen ordnungsgemäß nach Zeichen und nicht nach Byteanzahl zu iterieren und darauf zuzugreifen: mb_strlen, < a href = "http://php.net/mb_substr" rel = "nofollow"> mb_substr .

1
deceze 23 Dez. 2015 im 11:33

strlen () ist ein Einzelbyte:

strlen() gibt die Anzahl der Bytes und nicht die Anzahl der Zeichen in einer Zeichenfolge zurück.

UTF-8 ist nicht so, dass Sie die Multi-Byte-Alternative verwenden müssen: mb_strlen ()

Die gleiche Regel gilt für fast alle String-Manipulationen.

0
Álvaro González 23 Dez. 2015 im 11:32