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
Форумы портала PHP.SU » PHP » Программирование на PHP » Русские символы в strlen

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

1. dimka3210 - 02 Апреля, 2011 - 15:42:54 - перейти к сообщению
Хочу посчитать длину поста. Пост хранится в переменной $post_message. Пропускаю через трим и стрлен, значение кладу в переменую $strlen_post_message
PHP:
скопировать код в буфер обмена
  1. $strlen_post_message = trim(strlen($post_message));

Дальше сравниваю с int
PHP:
скопировать код в буфер обмена
  1.  
  2. $bb_cfg['f_post'] = 18;
  3. if((int)$strlen_post_message <= (int)$bb_cfg['f_post'])
  4.  

Есть одна проблема, русские символы считает за 2.
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. 12 значение 2
  3. 1234 значение 4
  4. сп значение 4
  5. 12сп значение 6
  6. ааа значение 6
  7. спасибо! значение 15
  8. asd значение 3
  9. dfffff значение 6
  10.  
  11.  


В чём проблема? Почему русские символы считает за 2, а цифры, запятые и т.п. за 1?

П.С. до этого не обращал внимания. Огорчение
Если надо: PHP Version 5.3.3
2. grefon - 02 Апреля, 2011 - 15:48:55 - перейти к сообщению
Потому что киррилические буквы в отличии от латиницы весят в 2 раза больше. А strlen считает не кол-во букв а кол-во байтов.
Не помню, но может у mb_strlen() такого нет.
3. valenok - 02 Апреля, 2011 - 15:57:00 - перейти к сообщению
как альтернатива при отключенной mb_*
PHP:
скопировать код в буфер обмена
  1.  
  2. if(!preg_match("#^.{1,".$maxlength."}$#",$str)) too long;
  3.  
4. JustUserR - 02 Апреля, 2011 - 19:54:35 - перейти к сообщению
dimka3210 пишет:
В чём проблема? Почему русские символы считает за 2, а цифры, запятые и т.п. за 1?
В качестве возможной причины осуществления некорректного функционирования предполагаемого PHP-приложения, допустимо рассмотрение аспекта проведения действенных составляющих элементов на основании специфицированных информационных полей во вторичном внутреннем базовом элементном уровне трактования, относительно которого не обеспечивается выполнение предшествующий действий для поддержания организации совмещения унимодальных информационных составляющих объектов, относительно критериев ассоцированной кодовой таблицы и разграничивыющих и управляющих элементов
5. dimka3210 - 03 Апреля, 2011 - 00:19:24 - перейти к сообщению
Всё решил. Спасибо всем кто помог. Проблема была в UTF8. Сделал через iconv.
6. Okula - 03 Апреля, 2011 - 00:39:06 - перейти к сообщению
dimka3210 пишет:
Всё решил. Спасибо всем кто помог. Проблема была в UTF8. Сделал через iconv.

зачем конвертировать кодировку если функция mb_strlen() отлично справляется с поставленной задачей. Нужно было прислушаться ещё ко 2 посту в теме.
7. dimka3210 - 03 Апреля, 2011 - 00:40:12 - перейти к сообщению
Okula к сожалению почему то не получалось.
8. Okula - 03 Апреля, 2011 - 00:50:16 - перейти к сообщению
dimka3210, потому что 2-ым параметром кодировку нужно указывать. Тогда всё получится.
9. dimka3210 - 03 Апреля, 2011 - 00:51:41 - перейти к сообщению
Okula пишет:
dimka3210, потому что 2-ым параметром кодировку нужно указывать. Тогда всё получится.

Возьму на заметку. Спасибо за хитрость) Теперь сожалею что раньше не использовал форум для обучения).
10. Okula - 03 Апреля, 2011 - 00:55:23 - перейти к сообщению
Описание к функциям нужно внимательнее читать. Улыбка
11. Мелкий - 03 Апреля, 2011 - 01:09:28 - перейти к сообщению
dimka3210 пишет:
Возьму на заметку. Спасибо за хитрость) Теперь сожалею что раньше не использовал форум для обучения).

Либо же mb_internal_encoding, тогда будет действовать на весь скрипт.

 

Powered by ExBB FM 1.0 RC1