Mb_strtolower, strtolower, stripos и др. не работают с русскими символами

Статус
Закрыто для дальнейших ответов.

mirra88

Member
Регистрация
30.08.2012
Сообщения
14
Уважаемые форумчане, доброго времени суток. Проблема проявилась таким образом.
Когда я ввожу в код php строки, то они выводятся на экран нормально, но стоит обработать их функциями mb_strtolower, strtolower, stripos и некоторыми другими и строки сразу же превращаются в вопросы. Например если я введу:
Код:
$A="мяч";
echo $B="Наш мячик очень оригинальный!";
то $B в таком же виде, как я ввела и будет отображена на экране. Но уже попытка преобразовать строку к нижнему регистру:
Код:
echo $loveTextB= mb_strtolower($B);
приведёт к тому, что на экране $loveTextB отобразится вот так: ��� ����� ����� ������������!
В итоге результат работы функций непредсказуем. Например, попытка найти первую позиции вхождения в $B подстроки $A:
Код:
echo $pos=stripos($loveTextB, $loveTextA);
или
Код:
echo $pos=stripos($B, $A);
приведёт к выводу числа 7, что абсолютно не соответствует действительности. И я подозреваю, что это из-за этой вот петрушки с кодировками. Потому что если я перехожу на английский регистр, то всё становится нормально. И перевод к нижнему регистру строку не меняет и номера позиций правильно выдаются.
Тестирую на Denver, PHP Version 5.2.12. В настройках сервера стоит:
Код:
character_set_client utf8
character_set_connection utf8
character_set_database cp1251
character_set_filesystem binary
character_set_results utf8
character_set_server cp1251
character_set_system utf8
Кодировка в разделе для мета тегов указана:
Код:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> ;
В cкрипте настроек php прописаны команды:
Код:
header('Content-Type: text/html; charset= utf-8');
и
Код:
setlocale(LC_ALL, 'Russian_Russia.65001');
Подключен файл .htaccess со строкой:
Код:
AddDefaultCharset utf-8
Никто не знает почему некоторые функции php так реагируют на русскую кодировку и как этот момент можно исправить или обойти?
 

lekzd

parse error: parse error, unexpected T_STRING...
Регистрация
17.02.2011
Сообщения
1 125
Попробуйте в коде

Код:
mb_internal_encoding('UTF-8');
mb_regex_encoding('UTF-8');
вызывать 1 раз, желательно в начале
 

mirra88

Member
Регистрация
30.08.2012
Сообщения
14
Lekzd, спасибо. С помощью советов на этом и других форумах мне удалось решить проблему. И для этого действительно пришлось вставить в php-скрипт команду
Код:
 mb_internal_encoding('UTF-8');
(mb_regex_encoding('UTF-8'); не вставляла). Но этого оказалось мало, мне пришлось ещё вместо функции stripos использовать функцию mb_stripos.
Ну и ещё для функции mb_strtolower можно явно добавить кодировку, с которой она должна работать
Код:
echo $loveTextB= mb_strtolower($B,'utf-8');
 

blackcot

Well-Known Member
Регистрация
10.09.2009
Сообщения
439
Denwer, кстати, странно как-то настроен - всё под кодировку windows-1251...
 
Статус
Закрыто для дальнейших ответов.
Верх Низ