Convendría tener el código completo a mano, pero este tipo de errores (no lee cosas, corta las strings de forma imprevisible, etc) se suelen dar por inconsistencia en la codificación y/o juego de caracteres.
Esta misma tarde estuve desarrollando un parser web para sacar RSS y tuve exactamente el mismo problema. La solución fue comprobar el charset de la web (en tu caso, el origen de la string que quieres manipular), que era ISO-8859-2. Luego, codificar el fichero .php con el mismo juego de caracteres (en Notepad++ es fácil, menú codificación), y por último, si aún sigues con problemas, declara el mismo charset manualmente en el HTML.
Si tratas con una base de datos, puedes utilizar http://www.php.net/manual/en/function.mysql-set-charset.php para que la conexión con la BD se realice con el mismo charset, aunque tendrías que ver qué charset está utilizando también la base de datos...
Lo que suele hacerse ahora es ponerlo todo en UTF-8 y recurrir a mb_substr(), que funciona para UTF-8 (mb es de multibyte).