Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: mb_strtolower, strtolower, stripos и др. не работают с русскими символами
 
 автор: mirra88   (25.04.2013 в 10:20)   письмо автору
 
 

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

  Ответить  
 
 автор: confirm   (25.04.2013 в 10:43)   письмо автору
 
   для: mirra88   (25.04.2013 в 10:20)
 

<?
$s 
'ТЕКСТ';
header('Content-type: text/html; charset=utf-8');
echo 
mb_strtolower($s'utf-8');

  Ответить  
 
 автор: psychomc   (25.04.2013 в 10:46)   письмо автору
 
   для: mirra88   (25.04.2013 в 10:20)
 

Нужно внимательнее читать мануал

  Ответить  
 
 автор: Sfinks   (25.04.2013 в 11:49)   письмо автору
 
   для: psychomc   (25.04.2013 в 10:46)
 

Строго говоря в мануале есть все!
Не подскажете нахрена тогда нужены форумы по программированию, если абсолютно все можно найти в мануале и в гугле?
Тем более, что тут ТС явно что-то читал, но недоразобрался!
Да это и не мудрено. Согласитесь, что для новичка разобраться в веб-среде с кодировками не очень просто?
И вопрос задан развернуто, а не просто: "ПОМОГИТЕ, у меня вопросы вместо букаф!!!".
Или вы правда думаете что этот ваш ответ будет кому-то полезен?
Прям вот чел так прочитает, и воскликнет: -Эврика! Мануал! Как я не догадалась!

  Ответить  
 
 автор: psychomc   (25.04.2013 в 15:55)   письмо автору
 
   для: Sfinks   (25.04.2013 в 11:49)
 

если человек умеет читать, зайдет на php.net и посмотрит описание функции, то с большой вероятностью так и будет. а еще лучше запустить пару примеров и обратить внимание на комментарии, они там даются не просто так

p.s я помню как начинал сам, и допускал много ошибок именно из-за того, что не внимательно читал документацию, а если что-то не получалось, сразу же бежал на форумы. самому решить свою проблему куда полезнее, чем если тебе дадут сразу готовый ответ. считаю, что лучше потратить несколько часов своего времени, но все-таки добиться самому, чем если за тебя это сделает кто-то более опытный за минуты.
поэтому да, я считаю что мой ответ будет кому-то полезен.

  Ответить  
 
 автор: Yuriev   (25.04.2013 в 12:30)   письмо автору
 
   для: psychomc   (25.04.2013 в 10:46)
 

А, что, если внимательно прочитать мануал, а в коде и настройках ничего не менять, то все сразу станет работать правильно?

  Ответить  
 
 автор: psychomc   (25.04.2013 в 15:58)   письмо автору
 
   для: Yuriev   (25.04.2013 в 12:30)
 

см выше

  Ответить  
 
 автор: mirra88   (25.04.2013 в 13:21)   письмо автору
 
   для: mirra88   (25.04.2013 в 10:20)
 

Всем спасибо за помощь.
Сonfirm, но ведь явно добавить кодировку
echo mb_strtolower($s, 'utf-8'); 
можно только для mb_strtolower, а есть же ещё stripos и mb_stripos... Только строка
header('Content-type: text/html; charset=utf-8'); 
тоже не помогла.

В общем, с помощью советов на этом и других форумах проблему удалось решить таким способом:
1 В скрипт php добавила строку указывающую настройки действующие на все мульбайтовые функции:
[mb_internal_encoding("UTF-8");

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

  Ответить  
 
 автор: confirm   (25.04.2013 в 14:00)   письмо автору
 
   для: mirra88   (25.04.2013 в 13:21)
 

header('Content-type: text/html; charset=utf-8'); не для помощи, а для корректного вывода, я мог бы его и не указывать в примере.
А что касается stripos, то она с мультибайтными строками не работает, и использовать ее для utf-8 нельзя.
mb_internal_encoding("UTF-8") - это установка кодировки по умолчанию, с которой работают функции, потому и написано вам было mb_strtolower($s, 'utf-8'), так как у вас установка была по умолчанию, а это не UTF-8.

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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования