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 :: Версия для печати :: mb_strtolower, strtolower, stripos и др. не работают с русскими символами
Форумы портала PHP.SU » » Кодировки и все смежное » mb_strtolower, strtolower, stripos и др. не работают с русскими символами

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

1. mirra88 - 25 Апреля, 2013 - 09:46:30 - перейти к сообщению
Уважаемые форумчане, доброго времени суток. Проблема проявилась таким образом.
Когда я ввожу в код 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 со строкой:
CODE (text):
скопировать код в буфер обмена
  1. AddDefaultCharset utf-8

Никто не знает почему некоторые функции php так реагируют на русскую кодировку и как этот момент можно исправить или обойти?
2. DeepVarvar - 25 Апреля, 2013 - 10:42:03 - перейти к сообщению
Вы пишете в редакторе символы в вин-1251, а ставите заголовки утф-8, ну или наоборот..
3. DelphinPRO - 25 Апреля, 2013 - 10:55:52 - перейти к сообщению
DeepVarvar пишет:
Вы пишете в редакторе символы в вин-1251, а ставите заголовки утф-8, ну или наоборот..

Проще говоря - сами файлы тоже сохраняйте в utf кодировке
4. mirra88 - 25 Апреля, 2013 - 12:07:23 - перейти к сообщению
Спасибо за помощь. С помощью советов на этом и других форумах проблему удалось решить таким способом:
1 В скрипт php добавила строку указывающую настройки действующие на все мульбайтовые функции:

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

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

 

Powered by ExBB FM 1.0 RC1