О, знаменитая же штука, которую обещали поправить в PHP6 (сделав это главной фичей), но не справились.
Решение: пройдитесь по коду, и замените substr на mb_substr, strlen на mb_strlen. Возможно, другие mb_ — аналоги, которые найдёте по ходу дела.
подозреваю что у вас кодировка utf-8. соответственно русские символы занимают больше одного байта. Далее ваша функция вывода, берет n-количество байтов текста, и в некоторых случаях, отрезается байт символа, отсюдова и появляется иероглиф.