Аналог php функции ucfirst для перевода первого символа в верхний регистр

TBAG
На сайте с 28.05.2012
Offline
78
3053

Коллеги, подскажите, может кто сталкивался с такой проблемой: в php нет стандартной функции ucfirst для кодировки UTF-8, есть только самописные аналоги типа:


// Функция для всех кодировок
if(!function_exists('mb_ucfirst'))
{
function mb_ucfirst($str, $encoding = NULL)
{
if($encoding === NULL)
{
$encoding = mb_internal_encoding();
}

return mb_substr(mb_strtoupper($str, $encoding), 0, 1, $encoding) . mb_substr($str, 1, mb_strlen($str)-1, $encoding);
}
}

Но букву "я" эта функция не воспринимает, на выходе вместо неё знак вопроса "?". Сколько облазил форумов, везде есть эта проблема с буквой "я". Кто-нибудь может подсказать решение этой проблемы? Спасибо.

http://presite.ru/ (http://presite.ru/) - SMM (http://presite.ru/karta-sayta-1.html) только самые качественные материалы (http://www.presite.ru/#top) по раскрутке сайтов и их оптимизации в поисковых системах (http://presite.ru/index.php?option=com_xmap&sitemap=1&view=xml).
Asar
На сайте с 23.08.2004
Offline
330
#1

Вот эта нормально работает:

function my_ucfirst($string, $e ='utf-8') {

if (function_exists('mb_strtoupper') && function_exists('mb_substr') && !empty($string)) {

$string = mb_strtolower($string, $e);

$upper = mb_strtoupper($string, $e);

preg_match('#(.)#us', $upper, $matches);

$string = $matches[1] . mb_substr($string, 1, mb_strlen($string, $e), $e);

} else {

$string = ucfirst($string);

}

return $string;

}

Хелпзонович
На сайте с 15.06.2005
Offline
133
#2

Что-то у Вас с настройками не то. Ибо работает Ваша функция нормально.

Попробуйте так изменить что-ли


// Функция для всех кодировок
if(!function_exists('mb_ucfirst'))
{
function mb_ucfirst($str, $encoding = NULL)
{
if($encoding === NULL)
{
$encoding = mb_internal_encoding("UTF-8");
}

return mb_substr(mb_strtoupper($str, $encoding), 0, 1, $encoding) . mb_substr($str, 1, mb_strlen($str)-1, $encoding);
}
}
Вы там держитесь! Хорошего вам настроения. Здоровья.
[Удален]
#3

Вот такая есть функция http://php.net/mb_convert_case

Выдержка из статьи

<?php

// исходная строка
$string = "яблоки на снегу";
// перевод в верхний регистр первого символа строки
// получаем первый символ строки
$first_char = mb_substr($string, 0, 1, 'UTF-8');
// переводим первый символ в верхний регистр
$first_upper = mb_convert_case($first_char, MB_CASE_TITLE, 'UTF-8');
// берем от строки все символы, кроме первого
$all_characters = mb_substr($string, 1, mb_strlen($string), 'UTF-8');
// соединяем первый символ и все остальные
$result = $first_upper . $all_characters;
// вывод результата
echo "result: $result";

result: Яблоки на снегу

TBAG
На сайте с 28.05.2012
Offline
78
#4
web2033:
Вот такая есть функция

Режет первый символ, а иногда и несколько:

яблоко

result: блоко

молоко

result: око

---------- Добавлено 13.07.2015 в 15:08 ----------

Хелпзонович:
Попробуйте так изменить что-ли

Выдает ошибку в строке:

return mb_substr(mb_strtoupper($str, $encoding), 0, 1, $encoding) . mb_substr($str, 1, mb_strlen($str)-1, $encoding);

Warning: mb_strtoupper() [function.mb-strtoupper]: Unknown encoding "1" in Z:\home\algorithms.ru\www\includes\function.php on line 12

Warning: mb_substr() [function.mb-substr]: Unknown encoding "1" in Z:\home\algorithms.ru\www\includes\function.php on line 12

Warning: mb_substr() [function.mb-substr]: Unknown encoding "1" in Z:\home\algorithms.ru\www\includes\function.php on line 12

Хелпзонович:
Что-то у Вас с настройками не то. Ибо работает Ваша функция нормально.

Кодировка в БД: utf8_unicode_ci

Кодировка переменной в файле скрипта при проверке mb_detect_encoding выдает: UTF-8

Кодировка сервера: UTF-8 Unicode (utf8)

Сопоставление кодировки соединения с MySQL: utf8_unicode_ci

В чем тут дело не могу понять?

---------- Добавлено 13.07.2015 в 15:21 ----------

Asar:
Вот эта нормально работает:

Вообще не выдает результата - пустая строка

K
На сайте с 03.06.2015
Offline
45
#5

Кодировку самого файла скрипта проверьте. Переменные и все остальные каналы - это переменные и каналы, а файл - сам по себе. Если он в анси, то все скаляры будут в анси соотв.

ЧТобы каждый раз не прописывать кодировку на все зависимые от нее функции, один раз напишите


const PAGE_ENCODING='UTF-8';

if(mb_internal_encoding(PAGE_ENCODING)!=PAGE_ENCODING)
die('There is no support for : '.PAGE_ENCODING);
MYSQL PHP JS HTML CSS SEO TXT США СССР
TBAG
На сайте с 28.05.2012
Offline
78
#6
kostyanet:
Кодировку самого файла скрипта проверьте. Переменные и все остальные каналы - это переменные и каналы, а файл - сам по себе. Если он в анси, то все скаляры будут в анси соотв.

Ах, ты, вот оно что, да, действительно, упустил один include, в котором скрипт выводился, у него как раз ANSI и стояла! Всем спасибо!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий