Also, ich glaub, ich hab es selbst gefunden.
Es geht nicht, da die Array-Notation für Strings nicht Multibyte-Aware ist.
PHP unterscheidet zwischen normalen ASCII Zeichen (0..127) und Extended ASCII Zeichen (128..255). Für die Extended ASCIIs (und darüber hinausgehende Kodierungen (etwa utf-8) gibt es die Multibyte Funktionen.
// So liefern die PHP Funktionen strLen und mb_strlen für nicht-extended ASCII Zeichen (0..127) den selben Wert:
$strTest = 'abc';
echo 'out1 = ' .strlen($strTest) .'<br>'; // result = 3
echo 'out2 = ' .mb_strlen($strTest) .'<br>'; // result = 3
// Für extended ASCII Zeichen (128..255), liefern strLen und mb_strlen aber unterschiedliche Werte:
$strTest = 'äöü';
echo 'out1 = ' .strlen($strTest) .'<br>'; // result = 6 (strlen zählt jetzt 2 Byte je Zeichen)
echo 'out2 = ' .mb_strlen($strTest) .'<br>'; // result = 3 (Multibyte-Length bleibt bei drei Byte)
Für Multibyte-Strings, kann man jetzt noch versuchen über die Array Notation 2 Bytes zu schreiben; für die normalen ASCIIs bekommt das hin (also z.B. $strTest[2] = ''; $strTest[3] = 'x'), aber für Sonderzeichen geht das schief.
Also werde ich wohl alle meine strlen, strpos und substr etc. durch die entsprechenden mb-Varianten ersetzen.
Wer das noch genauer wissen möchte, hier gibt es ein paar Links:
http://www.sitepoint.com/working-wit...ibyte-strings/
http://stackoverflow.com/questions/9...-string-in-php
http://iconoun.com/articles/collisions/