Версия php 5.2.8.
Для работоспособности приведённого способа надо собрать php с поддержкой Multibyte String (флаг nls в Gentoo, параметр –enable-mbstring при ручной сборке). А дальше заменяем функцию ucfirst на следующую конструкцию:
$string = mb_strtoupper(mb_substr($string, 0, 1, 'UTF-8'), 'UTF-8') . mb_substr($string, 1, mb_strlen($string), 'UTF-8');
Источник: Функция ucfirst в PHP и кирилица в кодировке UTF-8