strlen() liefert beispielsweise immer die Anzahl der Bytes im String. Das ist bei UTF-8 aber nicht gleich der Anzahl der Zeichen.
Das ist nicht ganz richtig, strlen liefert die Länge des gegebenen Strings und das ist so (lt. Doku) gedacht: "Returns the length of the given string." und keineswegs die Anzahl der Bytes im String.
Die Funktion ist aber eben leider nicht multibyte safe und liefert daher bei UTF-8 falsche Ergebnisse.
Das hat man bei vielen Funktionen behoben, indem man einfach eine Extension zur Verfügung stellt, die aber nicht per default enhalten ist.
Im Falle von strlen() ist das mb_strlen().
Mit PHP 6 wird aber afaik dieser Fehler korrigiert und die betreffenden Funktionen, die jetzt eine mb_-Variante haben, werden Multibyte-Safe.
Man darf sich also auf _keinen Fall_ darauf verlassen, dass strlen() die Anzahl der Bytes in einem geegebenen String zählt bzw. dass das immer so bleiben wird.