str_ireplace() и кириллица

mfl

Новичок
str_ireplace() и кириллица

В общем код:
PHP:
<?php 
$text="ЯблОКо1 ЯБЛОКО1 яблоко1 fo FO <br/>"; 
// устанавливаем русскую локаль 
setlocale(LC_ALL, array("ru_RU.CP1251", "ru_SU.CP1251", "ru_RU", "russian", "ru_SU", "ru")); 

// проверяем функции рег.выражений 
print preg_replace("~я~i", "*", $text); 

// проверяем строковые функции 
print strtolower($text); 

// проверяем str_ireplace 
print str_ireplace("яб", "*", $text); 
print str_ireplace("f", "*", $text); 

// теперь внимание: проверяем str_ireplace с заменой одного символа кириллицы 
print str_ireplace("я", "*", $text); 
?>
Вот что на выходе (обращаем внимание на последнюю строку):
*блОКо1 *БЛОКО1 *блоко1 fo FO
яблоко1 яблоко1 яблоко1 fo fo
*лОКо1 *ЛОКО1 *локо1 fo FO
ЯблОКо1 ЯБЛОКО1 яблоко1 *o *O
ЯблОКо1 ЯБЛОКО1 *блоко1 fo FO
т.е. функция становится чувствительна к регистру символов кириллици.
От сюда вопрос, из за чего такое поведение функции?
Если проблема с локалью, почему тогда остальные функции работают корректно?

Замечена эта странность именно кода php работает на Unix
На windows работа корректная
 

mfl

Новичок
В смыле, остальных?
то что выше print str_ireplace("я", "*", $text); в моем примере - это и есть остальные функции.
Они, как видим, работают корректно (не зависят от регистра)

-~{}~ 23.02.08 15:03:

Можете показать корректную работу этого скрипта на сервере с Unix?
 

TutanXamoN

Новичок
FreeBSD 6.2
Apache 2.2.8
PHP 5.2.5
MySql 5.0.37
PHP:
*блОКо1 *БЛОКО1 *блоко1 fo FO 
яблоко1 яблоко1 яблоко1 fo fo 
*лОКо1 *ЛОКО1 *локо1 fo FO 
ЯблОКо1 ЯБЛОКО1 яблоко1 *o *O 
*блОКо1 *БЛОКО1 *блоко1 fo FO
-~{}~ 23.02.08 14:15:

А вообще интересно у вас получается:
PHP:
print str_ireplace("яб", "*", $text);
отработало наплевав на регистр
, а
PHP:
print str_ireplace("я", "*", $text);
уже учитывает.
 

mfl

Новичок
А вообще интересно у вас получается:
PHP:
print str_ireplace("яб", "*", $text);
отработало наплевав на регистр
, а
PHP:
print str_ireplace("я", "*", $text);
уже учитывает.
Вот, вот :(

Значить ОС, сдесь не причем.
В чем же может быть проблема?

-~{}~ 23.02.08 15:24:

C php точно все нормально, пробовал на нескольких хостингах.
На одном даже php переустанавливали на 5.2.5, результат один и тот же
Замечено было не только мной, смотрите последний пост
h**p://forum.searchengines.ru/showthread.php?t=207558
 

mfl

Новичок
TutanXamoN
На серверах хостинг-провайдеров - FreeBSD
На локальном компе - WinXP (корректно работает только в этом случае).

Еще,
FreeBSD 6.2
Apache 2.2.8
PHP 5.2.5
MySql 5.0.37
Вы случайно не на русском Apache проверяли?
Дело в том, что на компе установлен русский апач, возможно по этому и работает корректно.
 

TutanXamoN

Новичок
mfl
Не люблю русский апач. Ето моя тестовая старая машина на которой я всё тестю и там стоит оригинальный апач.
 

mfl

Новичок
локаль находится точно
setlocale(LC_ALL, 0);
ru_RU.CP1251

это я сразу проверил.
массив привел только для того, что бы другие могли проверить.
 

fixxxer

К.О.
Партнер клуба
проблема случайно не именно с буквой "я" в 1251? возможно это прикол с (signed)255 -> -1 -> EOF ;)
 

mfl

Новичок
fixxxer
Нет, проблема со всеми буквами.
А что за "прикол с (signed)255 -> -1 -> EOF"? Впервые слышу, можно ссылку?
 

phprus

Moderator
Команда форума
fixxxer
Нет. Тут проблема в другом. По крайней мере я не нашел потенциальных мест, где-бы могло начать глючить преобразование регистров.

mfl
А что за "прикол с (signed)255 -> -1 -> EOF"? Впервые слышу, можно ссылку?
Прочитай эту тему http://phpclub.ru/talk/showthread.php?s=&threadid=102835 Я в ней несколько раскрыл эту тему.

Нет, проблема со всеми буквами.
Проблема со всеми буквами кириллицы или еще и с буквами латиницы тоже проблема? Проблема возникает только если строка для поиска состоит из одного символа?
 

mfl

Новичок
phprus
проблема только со всеми буквами кириллицы и только если строка для поиска состоит из одного символа.
 

mfl

Новичок
melo
К сожалению, так и не нашел решения, в последствии стал пользоваться только прегом. Сейчас, str_ireplace ни где не использую.
 
Сверху