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. Haron - 05 Апреля, 2011 - 18:44:40 - перейти к сообщению
Итак, передаю я функции strlen() русскую строку (естественно urldecode) в кодировке utf-8 и начинаются интересные вещи!
Оказывается, что длина слова "ты" - 4 символа, слова "член" - 8 символов, тогда как длина слова "ас" - 44(!) символа.

Парни, что делать? Есть ли способ правильно определить число букв в utf-8 русском слове?
2. valenok - 05 Апреля, 2011 - 19:05:51 - перейти к сообщению
3. Haron - 05 Апреля, 2011 - 19:17:30 - перейти к сообщению
valenok пишет:


Не канает Недовольство, огорчение
Результаты работы multibyte-функции:

Длина строки из одной (любой) русской буквы равна 11
Длина слова "вся" - 33

Да и ещё...
В поисках решения проблемы и независимости от multibyte расширения -, был придуман такой вот костыль:
PHP:
скопировать код в буфер обмена
  1. function ce_strlen($str) {
  2.         $str = utf8_decode($str);
  3.         $k = 0;
  4.         while(@$str{$k}) {
  5.                 $arr[$k] = $str{$k};
  6.                 $k++;
  7.         }
  8.         return count($arr);
  9. }


Выдаёт те же печальные результаты на некоторых словах, что и mb_strlen();
4. OrmaJever - 05 Апреля, 2011 - 19:31:42 - перейти к сообщению
Haron пишет:
Не канает

если написали значит это работает, просто вы что-то не так делаете!
5. valenok - 05 Апреля, 2011 - 19:36:52 - перейти к сообщению
Дайте угадаю. Длинна слова из 10 букв у вас 1010 ?
6. DeepVarvar - 05 Апреля, 2011 - 19:39:07 - перейти к сообщению
Haron строка откуда появляется? Из файла? $_GET/POST? Из базы?
7. Haron - 05 Апреля, 2011 - 19:47:31 - перейти к сообщению
Цитата:
Дайте угадаю. Длинна слова из 10 букв у вас 1010 ?

Не угадали, FAIL

Цитата:
Если написали значит это работает, просто вы что-то не так делаете!

А если напишут что йа редиско, йа редиско?

Цитата:
Haron строка откуда появляется? Из файла? $_GET/POST? Из базы?

Из массива $_GET.

Правда, $_GET - сразу обрабатывается функцией очистки от "вредных" вложений:
PHP:
скопировать код в буфер обмена
  1. function __data_clean($input)
  2.         {
  3.                 $utf8 = (preg_match("/^([\x09\x0A\x0D\x20-\x7E]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})*$/", $input)) ? true : false;
  4.                 if ($utf8)
  5.                 {
  6.                         $input = urldecode($input);    
  7.                 }
  8.                 else
  9.                 {
  10.                         $input = iconv('cp1251', 'UTF-8', (urldecode($input)));
  11.                 }
  12.                 $input = htmlentities($input, ENT_QUOTES, 'UTF-8');
  13.                 $input = strip_tags($input);
  14.                 $input = str_replace ("\n"," ", $input);
  15.                 $input = str_replace ("\r","", $input);
  16.                 return $input;
  17.         }


Однако, на проблему она никак не влияет (Проблема сохраняется если данные идут мимо функции). Задача этой функции - получить на выходе безопасную строку unicode и работает она корректно.
8. DeepVarvar - 05 Апреля, 2011 - 19:52:50 - перейти к сообщению
Заголовки при отдаче страницы (с которой потом этот ГЕТ прилетает) отправляете?
PHP:
скопировать код в буфер обмена
  1. header('Content-Type: text/html; charset=utf-8');
9. Haron - 05 Апреля, 2011 - 19:57:45 - перейти к сообщению
DeepVarvar пишет:
Заголовки при отдаче страницы (с которой потом этот ГЕТ прилетает) отправляете?
PHP:
скопировать код в буфер обмена
  1. header('Content-Type: text/html; charset=utf-8');


Конечно. Более того, все файлы проекта, база данных и типы записей - utf-8.
Файлы без BOM
10. valenok - 05 Апреля, 2011 - 19:58:58 - перейти к сообщению
создайте отедльный файл и выполните в нем команды
PHP:
скопировать код в буфер обмена
  1.  
  2. echo mb_strlen('член', 'UTF-8'), ', ', mb_strlen($_GET['x'], 'UTF-8');
  3.  
11. DeepVarvar - 05 Апреля, 2011 - 20:09:37 - перейти к сообщению
valenok пишет:
и выполните

У меня все прошло удачно. (nginx,phpFCGI)
12. Haron - 05 Апреля, 2011 - 20:17:56 - перейти к сообщению
Нашёл ошибку. Прошу прощения, всё нормально Улыбка. Зря гнал.
13. DeepVarvar - 05 Апреля, 2011 - 20:22:53 - перейти к сообщению
Haron а что было то?
14. Haron - 05 Апреля, 2011 - 20:28:03 - перейти к сообщению
Два прогона вместо одного (в некоторых случаях) в цикле с echo.
Так что товарищ Valenok оказался таки прав Улыбка Приношу ему извинения.

 

Powered by ExBB FM 1.0 RC1