Не пойму, что за проблема с кодировкой?
Какой-нибудь непечатный символ в начале может быть. Сделайте сначала trim();
mb_internal_encoding("UTF-8");
function mb_ucfirst($text) {
    return mb_strtoupper(mb_substr($text, 0, 1)) . mb_substr($text, 1);
}
echo mb_ucfirst("тест\n");
*Копипаст со стак оверфлов*