Вы вводите поврежденные символьные данные в функцию или не указали правильную кодировку.
У меня была эта проблема некоторое время назад, старое поведение (до PHP 5.2.7, я полагаю) заключалось в том, чтобы возвращать строку, несмотря на повреждение, но, начиная с этой версии, вместо этого она выдаст эту ошибку.
Мое решение заключалось в написании сценария для передачи моих строк через iconv с использованием модификатора // IGNORE для удаления поврежденных данных.
(У нас была поврежденная база данных, в UTF-8 было несколько строк, некоторые в латинице-1, обычно с неправильно определенными типами символов в столбцах).
(Глядя на комментарий к ответу Тату, я бы начал с просмотра (и игры с) содержимым переменной $ charset.