Это не в substr и даже не mb_substr дело, а в несоответствии кодировок. Проверьте чтобы файлы задействованные для вывода � и данные в БД были в одной кодировке (utf-8).
Перед выполнением sql запроса, выполните SET NAMES UTF-8
также можно в php перед выводом строки изменить ее кодировку с помощью iconv