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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Что за бред с строковыми функциями strlen() и mb_strlen()?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
nkl
Отправлено: 29 Октября, 2014 - 12:58:45
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




Всем добра! И так, что мы имеем:
файл 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 символов.
 
 Top
Panoptik
Отправлено: 29 Октября, 2014 - 13:12:20
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)






-----
Just do it
 
 Top
nkl
Отправлено: 29 Октября, 2014 - 13:20:59
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




Panoptik, спасибо. И еще, если явно задать кодировку при помощи:

То последний параметр можно опустить.
 
 Top
OrmaJever Модератор
Отправлено: 29 Октября, 2014 - 13:48:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




nkl пишет:
знаю, что utf8 занимает 2 байта в памяти, но фактически это же 1 символ

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


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
esterio
Отправлено: 29 Октября, 2014 - 16:01:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




нужно явно указивать UTF-8 для mb_*
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB