19:45

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
PHP и русский текст.

Здравствуйте.
Возникла проблема, часть функций PHP (5.3.10) работает только с английским текстом.
Самый простой пример - strtoupper(). Если в переменной английский текст, то функция работает нормально и строчные буквы становятся заглавными. А вот если в переменной русский текст, то ничего не происходит.
Я так понимаю, тут надо что-то в php.ini прописать?

Помогите, пожалуйста.

upd: если в переменную вбить и русские и английские символы, то английские становятся большими, а русские остаются прежними.

Комментарии
24.02.2012 в 19:53

fire-dragon
смотрите в сторону модуля mb_string
24.02.2012 в 21:33

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
fire-dragon, А как на него смотреть? В каталоге php ничего похожего по названию не наблюдается.

Поиск по поисковикам даёт три решения.
1) использовать функцию setlocate. Ноль эффекта абсолютно.
2) написать свою функцию для преобразования символов. Нерационально.
3) испльзовать mb_strtoupper. Работает только частично, не все символы обрабатывает, одни делает большими, другие не делает. + на форумах народ пишет, что она работает медленнее, чем strtoupper и это заметно при большом количестве запросов и в больших циклах. Так что тоже не вариант.

И да, забыл написать - у меня .php-файлик в ANSI сохранён. Сохранение в других кодировках результата не даёт.
24.02.2012 в 21:39

fire-dragon
www.php.net/manual/en/mbstring.configuration.ph...
возможно нужно изменить настройки по умолчанию. Аски кстати 7 битный, точнее не так, там мусор во второй половине. Так что если вы сохраняете из нотепада в аски то по умолчанию сохраняете в windows-1251
24.02.2012 в 22:17

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
fire-dragon, Ну, мне собсно и нужно cp1251 везде. Редактирую обычным виновским блокнотом.

Проблема решилась, но я так и не понял до конца причину. И походу она решилась не до конца.

В общем, решилось всё так.

1) Прописываю в коде странички: echo setlocale(LC_CTYPE, "");
2) Обновляю страничку в браузере и смотрю что мне выдало. А выдало мне следующее: Russian_Russia.1251
3) После этого в код странички вставляю: setlocale(LC_ALL, "Russian_Russia.1251");
4) Обновляю страничку, вижу, что стало нормально работать.
И вот тут начинается самое весёлое.
5) Удаляю из кода странички: setlocale(LC_ALL, "Russian_Russia.1251");
6) Обновляю страничку - усё продолжает работать!!! о_О
7) Выключаю апач. Включаю заново - перестало работать.

То бишь, либо в каждый скрипт пихать setlocale(LC_ALL, "Russian_Russia.1251");, либо это всё будет работать до первого перезапуска сервера(((

В общем, поищу сейчас, где это можно прописать, чтобы действовало на всех.
Спасибо за ссылку, сейчас погляжу чего там можно натворить)
24.02.2012 в 22:28

fire-dragon
посмотри еще в httpd.conf

defaultcharset
mod_encoding
24.02.2012 в 22:39

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
fire-dragon, посмотри еще в httpd.conf

defaultcharset
mod_encoding


Ни одного, ни другого в httpd.conf не найдено.

Он у меня, в принципе, почти дефолтный. Я только пути поменял соответственно установке и всё. Ну и ещё php там прописался, где модуль брать.
24.02.2012 в 23:01

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
fire-dragon, Прописал AddDefaultCharset utf-8. Пошли ромбики. Пересохранил страничку из ANSI в UTF-8. Стало отображаться нормально, но функция strtoupper так и не работает.
24.02.2012 в 23:14

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Прописал настройки mbstring под UТF-8. Не помогло. Видимо придётся везде setlocale прописывать(
24.02.2012 в 23:19

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Хех. Пришлось обратно переписать httpd.conf и файлик странички в cp1251, ибо в utf-8 вариант с setlocale не работает. Ладно, как-нибудь так пока побуду.
25.02.2012 в 14:59

fire-dragon
Ryuzaki_rnd, конечно это хак, но можно из ява скрипта вызвать тоаппер
25.02.2012 в 15:07

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
fire-dragon, Да ладно уже, просто придётся в каждый файл setlocale прописывать. Либо переписать strtoupper (как предлагают на большинстве форумов) и, либо включать эту переписанную хрень в каждый файл, либо прописать отдельным скриптом и подключать его каждый раз. Короче, в любом случае надо будет в каждый новый файл чего-то писать. Из всех вариантов setlocale вроде самый короткий. Так что пусть так будет.
Мне для тренировки php и так хватит. А потом, когда уже обкатаюсь и лучше буду разбираться, тогда можно будет на настройку переключиться. Сам язык сейчас просто приоритетней. ^^
25.02.2012 в 15:26

Sanctus Satanas
А какая там по дефолту локаль стоит?
echo setlocale(LC_ALL, 0);
25.02.2012 в 15:51

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--,

Если вбить echo setlocale(LC_ALL, 0); выдаёт просто "С".
Если вбить echo setlocale(LC_ALL, ""); выдаёт "Russian_Russia.1251".

То бишь, нужная локаль и так вроде стоит. Но пока не укажешь принудительно setlocale(LC_ALL, 'Russian_Russia.1251'); strtoupper работает только с латиницей.

upd: Возможно тут всё-таки в апаче дело. Я вот только сейчас заметил - после запуска апача функция не работает. Но если несколько раз обновить страничку, то она начинает работать о_О
25.02.2012 в 15:54

Sanctus Satanas
Странно. А реально кодировка текста в файлах (и особенно та, которая поступает в strtoupper) Windows-1251?
25.02.2012 в 15:59

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, А реально кодировка текста в файлах (и особенно та, которая поступает в strtoupper) Windows-1251?

Да. Тут даже не из формочки берётся, а просто в коде переменной строку назначил и играюсь с ней. Файлик сохранён в ANSI + в апаче прописано AddDefaultCharset cp1251

Насчёт upd из предыдущего коммента: сейчас несколько раз прогнал апач вкл/выкл. Не работает функция. То видимо глюк был или браузеры из кеша чего-то доставали.
25.02.2012 в 16:03

Sanctus Satanas
Хрень какая-то. ) А после рестарта апача, если сразу проверить, локаль тоже Russian_Russia.1251?
25.02.2012 в 17:22

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, Да, та же самая. Убрал из кода принудительную установку, вписал вывод локали, перезапустил апач: Russian_Russia.1251.

От в том-то и дело, что хрень. Нормально работает только если ему принудительно ту же локаль задать.
25.02.2012 в 17:28

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Вот! Поймал.

Прописан вывод локали: echo setlocale(LC_ALL, "");
Перезапуск апача. Первое открытие страницы - не работает.
Второе открытие страницы (обновление или запуск в другом браузере) - работает.

То бишь, как я понял, чтобы оно заработало необходимо, чтобы setlocale запустилась хоть один раз.
При первом запуске она просто делает то, что с неё хотят (в данном случае даёт данные для вывода), в последующие разы она уже помнит локаль и всё начинает работать. Дурдом.
25.02.2012 в 20:35

Sanctus Satanas
Ну это как раз нормально, что под виндой апач запоминает локаль для всего процесса. Про это явно написано в мануале пхп.
А вот то, что с первого раза ничего не работает — это дурдом, не спорю. )
26.02.2012 в 03:07

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
А вот то, что с первого раза ничего не работает — это дурдом, не спорю. )

Вот о том и речь. Первый раз не работает, а потом усё фурычит. Сейчас ось переставил, попробовал на чистой, авось с ней что-то не так. Но всё также - начинает работать только после однократного применения setlocale.
26.02.2012 в 03:10

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
"коммент продублировался, а удаляться не хочет"