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

M8
На сайте с 24.04.2013
Offline
15
1212

Уважаемые форумчане, доброго времени суток. Проблема проявилась таким образом.

Когда я ввожу в код 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 так реагируют на русскую кодировку и как этот момент можно исправить или обойти?

[umka]
На сайте с 25.05.2008
Offline
456
#1

setlocale(LC_CTYPE,"ru_RU.UTF-8");

mb_internal_encoding("UTF-8");

Лог в помощь!
IL
На сайте с 20.04.2007
Offline
435
#2
mirra88:
Никто не знает почему некоторые функции php так реагируют на русскую кодировку и как этот момент можно исправить или обойти?

что такое русская кодировка?

В ман, видимо, отправлять бесполезно..


echo $loveTextB= mb_strtolower($B,'utf-8');
... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
DV
На сайте с 01.05.2010
Offline
644
#3
mirra88:
��� ����� ����� ������������!

У вас браузеру отдаётся неверная кодировка. Через .htaccess поправьте.

---------- Post added 25-04-2013 at 10:36 ----------

О, правильно заметили, mb_strtolower надо указывать, в какой кодировке извращаться.

VDS хостинг ( http://clck.ru/0u97l ) Нет нерешаемых задач ( https://searchengines.guru/ru/forum/806725 ) | Перенос сайтов на Drupal 7 с любых CMS. ( https://searchengines.guru/ru/forum/531842/page6#comment_10504844 )
M8
На сайте с 24.04.2013
Offline
15
#4

Спасибо большое, когда я указала вот так:

echo $loveTextB= mb_strtolower($B,'utf-8');
то преобразованные строки стали отображаться правильно.

А как можно указать в какой кодировке работать другим функциям? Например stripos как выдавала, что "Мяч" входит в строку начиная с седьмой позиции, так и выдаёт. А стоит заменить всё на английские символы и номер позиции выдаётся правильно: четвёртая.

Изменение настройки локали на:

setlocale(LC_CTYPE,"ru_RU.UTF-8");

mb_internal_encoding("UTF-8");
не помогает.

Файл .htaccess со строкой:

AddDefaultCharset utf-8
у меня и так есть.

Ну а про русскую кодировку я просто неправильно сформулировала. Мне надо было написать вместо слов русская кодировка, слова русские символы

IL
На сайте с 20.04.2007
Offline
435
#5

Уважаемая mirra88, не поленитесь сходить в доки.. если не по языку, то хотя бы по интересующим Вас функциям.. их можно найти в любом поисковике, введя название.

Для многих строковых функций есть mb-аналоги, в частности, для stripos - http://php.net/manual/en/function.mb-stripos.php

int mb_stripos ( string $haystack , string $needle [, int $offset [, string $encoding ]] )

Вот $encoding - это "оно и есть".

M8
На сайте с 24.04.2013
Offline
15
#6

Спасибо. Действительно, когда вместо stripos стала испальзовать mb_stripos, то всё стало работать правильно.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий