Версия 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' );
Дискуссия
Есть более простой способ получения первой заглавной буквы для данного решения:
$string = mb_convert_case($string, MB_CASE_TITLE);