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 :: Версия для печати :: Что за бред с строковыми функциями strlen() и mb_strlen()?
Форумы портала PHP.SU » » Вопросы новичков » Что за бред с строковыми функциями strlen() и mb_strlen()?

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

1. nkl - 29 Октября, 2014 - 12:58:45 - перейти к сообщению
Всем добра! И так, что мы имеем:
файл file1.php (UTF-8 without BOM)
PHP:
скопировать код в буфер обмена
  1.  
  2. $str = 'ш123456789'; //всего 10 символов, русская буква "ш" и цифры от 1 до 9
  3. print strlen($str);
  4. print "<br>";
  5. print mb_strlen($str);
  6.  

Вывод:
Цитата:

11
11


Дальше:
файл file1.php (кодировка ANSI)
PHP:
скопировать код в буфер обмена
  1.  
  2. $str = 'ш123456789'; //всего 10 символов, русская буква "ш" и цифры от 1 до 9
  3. print strlen($str);
  4. print "<br>";
  5. print mb_strlen($str);
  6.  

Вывод:
Цитата:

10
10


Но, если вместо буквы (ш) мы поставим латинскую (g):
файл file1.php (в любой кодировке)
PHP:
скопировать код в буфер обмена
  1.  
  2. $str = 'g123456789'; //всего 10 символов, латинская буква "g" и цифры от 1 до 9
  3. print strlen($str);
  4. print "<br>";
  5. print mb_strlen($str);
  6.  

Вывод:
Цитата:

10
10


Проверял в Denwer'e (Win2k7 x64);

В итоге, у нас во всех строках фактически 10 символов, но правильное их кол-во считается только тогда, когда файл в кодировке ANSI. Я знаю, что utf8 занимает 2 байта в памяти, но фактически это же 1 символ, так почему же сцука спец. для этого написанная функция mb_strlen() все равно возвращает мне 11 символов, вместо десяти фактических? Нахмурился

P.S.
В линуксе при создание файла посредством команды touch encoding_test.php и последующей записи в него кода с помощью nano, тоже считает что в строке 'ш123456789' - 11 символов.
2. Panoptik - 29 Октября, 2014 - 13:12:20 - перейти к сообщению
3. nkl - 29 Октября, 2014 - 13:20:59 - перейти к сообщению
Panoptik, спасибо. И еще, если явно задать кодировку при помощи:

То последний параметр можно опустить.
4. OrmaJever - 29 Октября, 2014 - 13:48:41 - перейти к сообщению
nkl пишет:
знаю, что utf8 занимает 2 байта в памяти, но фактически это же 1 символ

ну правильно, только нужно знать что strlen считает байты, а не символы. Для юникода есть mb_* функции
(Добавление)
Сейчас посмотрел, в документации это написано
http://php.net/manual/ru/function.strlen.php
Цитата:
Замечание:
Функция strlen() возвратит количество байт, а не число символов в строке.
5. esterio - 29 Октября, 2014 - 16:01:01 - перейти к сообщению
нужно явно указивать UTF-8 для mb_*

 

Powered by ExBB FM 1.0 RC1