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 :: mb_strtolower, strtolower, stripos и др. не работают с русскими символами

 PHP.SU

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


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

> Описание: Если в строках есть русские буквы, то некоторые функции выдают неправильные результаты
mirra88
Отправлено: 25 Апреля, 2013 - 09:46:30
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Апр. 2013  


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




Уважаемые форумчане, доброго времени суток. Проблема проявилась таким образом.
Когда я ввожу в код php строки, то они выводятся на экран нормально, но стоит обработать их функциями mb_strtolower, strtolower, stripos и некоторыми другими и строки сразу же превращаются в вопросы. Например если я введу:
CODE (text):
скопировать код в буфер обмена
  1. $A="мяч";
  2. echo $B="Наш мячик очень оригинальный!";

то $B в таком же виде, как я ввела и будет отображена на экране. Но уже попытка преобразовать строку к нижнему регистру:
CODE (text):
скопировать код в буфер обмена
  1. echo $loveTextB= mb_strtolower($B);

приведёт к тому, что на экране $loveTextB отобразится вот так: ��� ����� ����� ������������!
В итоге результат работы функций непредсказуем. Например, попытка найти первую позиции вхождения в $B подстроки $A:
CODE (text):
скопировать код в буфер обмена
  1. echo $pos=stripos($loveTextB, $loveTextA);
или
CODE (text):
скопировать код в буфер обмена
  1. echo $pos=stripos($B, $A);

приведёт к выводу числа 7, что абсолютно не соответствует действительности. И я подозреваю, что это из-за этой вот петрушки с кодировками. Потому что если я перехожу на английский регистр, то всё становится нормально. И перевод к нижнему регистру строку не меняет и номера позиций правильно выдаются.

Тестирую на Denver, PHP Version 5.2.12. В настройках сервера стоит:
CODE (text):
скопировать код в буфер обмена
  1. character_set_client    utf8
  2. character_set_connection        utf8
  3. character_set_database  cp1251
  4. character_set_filesystem        binary
  5. character_set_results   utf8
  6. character_set_server    cp1251
  7. character_set_system    utf8

Кодировка в разделе для мета тегов указана:
CODE (text):
скопировать код в буфер обмена
  1. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> ;

В cкрипте настроек php прописаны команды:
CODE (text):
скопировать код в буфер обмена
  1. header('Content-Type: text/html; charset= utf-8');
и
CODE (text):
скопировать код в буфер обмена
  1. setlocale(LC_ALL, 'Russian_Russia.65001');

Подключен файл .htaccess со строкой:
Никто не знает почему некоторые функции php так реагируют на русскую кодировку и как этот момент можно исправить или обойти?
 
 Top
DeepVarvar Супермодератор
Отправлено: 25 Апреля, 2013 - 10:42:03
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




Вы пишете в редакторе символы в вин-1251, а ставите заголовки утф-8, ну или наоборот..
 
 Top
DelphinPRO
Отправлено: 25 Апреля, 2013 - 10:55:52
Post Id



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


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


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




DeepVarvar пишет:
Вы пишете в редакторе символы в вин-1251, а ставите заголовки утф-8, ну или наоборот..

Проще говоря - сами файлы тоже сохраняйте в utf кодировке


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
mirra88
Отправлено: 25 Апреля, 2013 - 12:07:23
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Апр. 2013  


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




Спасибо за помощь. С помощью советов на этом и других форумах проблему удалось решить таким способом:
1 В скрипт php добавила строку указывающую настройки действующие на все мульбайтовые функции:

2 Вместо функции stripos стала использовать mb_stripos.

Для функции mb_strtolower можно ещё явно добавить кодировку, с которой она должна работать
CODE (htmlphp):
скопировать код в буфер обмена
  1. echo $loveTextB= mb_strtolower($B,'utf-8');
 
 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