Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Как узнать регистр первой буквы в строке utf-8?
Форумы портала PHP.SU » » Кодировки и все смежное » Как узнать регистр первой буквы в строке utf-8?

Страниц (1): [1]
 

1. curiosity - 01 Октября, 2015 - 17:54:39 - перейти к сообщению
Задача, казалось бы, простая.
Есть текст и необходимо определить какой регистр у первого символа строки.
С английскими символами проблем нет. Но вот с кириллицей начинаются проблемы.
Использую, конечно же UTF-8, но...
В общем написал вот так:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5.         <title>Верхний регистр</title>
  6.         <meta http-equiv="content-type" content="text/html;charset=utf-8" />
  7. </head>
  8. <body>
  9.  
  10. <?php
  11. $value = "Съешь ещё этих мягких французских булок";
  12.  
  13. //Вывожу первый символ (для проверки)
  14. $first = mb_substr($value,0,1,'UTF-8');
  15. echo "$first<br>";
  16.  
  17. //Узнаю какой регистр
  18. if(ctype_upper($first)){
  19.         echo "Верхний<br>";
  20. }else{
  21.         echo "Нижний<br>";
  22. }
  23. ?>
  24.  
  25. </body>
  26. </html>
  27.  

Но работает это, мягко говоря, странно. С латиницей, как всегда, все отлично. А вот с кирюхой через раз, а точней - вообще криво.
Я так понял, что ctype_upper() не видит кодировку UTF-8...
Или же проблема в чем то другом.
Ребята, помоги разобраться.
Как нужно написать, чтоб всегда получать правильный регистр первого символа строки в кириллице?
2. Мелкий - 01 Октября, 2015 - 18:01:24 - перейти к сообщению
mb_strtoupper($first) == $first

curiosity пишет:
Я так понял, что ctype_upper() не видит кодировку UTF-8...

Не не видит, а вообще о ней не знает.
3. Deonis - 01 Октября, 2015 - 18:03:24 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $chr = mb_substr ($str, 0, 1, 'utf-8');
  2. if( mb_strtolower($chr, 'utf-8') != $chr ) {
  3.         echo 'Верхний';
  4. } else {
  5.         echo 'Нижний';
  6. }
4. curiosity - 01 Октября, 2015 - 18:26:13 - перейти к сообщению
Мелкий, Deonis Спасибо!
Как-то я не сообразил, что функции mb_strtoupper() и mb_strtolower() можно использовать таким образом... Хотя их и рассматривал.
Благо, что есть такие форумы, как этот и такие отзывчивые гуру, как вы!

Правильный результат:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?php
  3. $value = "Съешь ещё этих мягких французских булок";
  4. echo "$value<br>";
  5.  
  6. //Вывожу первый символ (для проверки)
  7. $first = mb_substr ($value, 0, 1, 'utf-8');
  8. echo "$first<br>";
  9.  
  10. //Узнаю какой регистр
  11. if( mb_strtolower($first, 'utf-8') != $first ) {
  12.        echo "Верхний<br>";
  13. } else {
  14.        echo "Нижний<br>";
  15. }
  16.  
  17. ?>
  18.  

 

Powered by ExBB FM 1.0 RC1