Долго искал причину появления знака вопроса в выводимых символах у себя на сайте. Оказалось, что для вывода в PHP-скрипте используется функция substr(), которая работает с однобайтными кодировками, а ведь данные у меня хранятся в UTF-8, где символ занимает два байта — вот поэтому-то некоторые символы «режутся» посередине и получаются такие знаки.
Решение: вместо substr() использовать функцию mb_substr().