Консультация № 65330
03.12.2006, 06:28
0.00 руб.
0 14 1
Здравствуйте!
Помогите, php запутал кодировки. windows, apache
в текстовом файле виндовая кодировка, такая же в ie, апач ничего не перекодирует (вроде бы, по крайней мере за ним такого раньше не замечалось).
Выполняю ниже приведённый скрипт, в результате получаю неизвестные символы. Конвертация файла не помогла перебрал dos koy8 iso mac. Коректно же вышло лишь при транслите. Может там какая другая кодировка? И как мне нормально считать и вывести виндовую?

Приложение:
$fp1 = fopen("menu.txt", "r");while ($menuitem = fscanf ($fp1, "%s\t%s\n")) {list ($name, $ahref) = $menuitem;echo "<a href="$ahref">$name</a>
\n";}fclose($fp1);

Обсуждение

Неизвестный
04.12.2006, 01:36
общий
А вот напримерfprintf($fp2, "привет люди\n");пишет правильно, в виндовой кодировке. Что делать не пойму!Может fscanf, как нибудь не правильно реагирует на символы?
Неизвестный
04.12.2006, 07:18
общий
Это действительно fscanf глючит. Кое-как (возможно неправильно) заставил выводить те символы которые я написал в текстовике. Выводит но не все. Например "н" понимает как конец строки. "к" пропускает. типа того. Может ещё чего в настройках кромеdefault_charset = "win-1251"
Неизвестный
04.12.2006, 10:51
общий
это ответ
Здравствуйте, Артём Талипов!
В Apache должно быть
AddDefaultCharset windows-1251

и в заголовке файла
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
Неизвестный
04.12.2006, 11:09
общий
AddDefaultCharset windows-1251 в апаче не нашел, даже просто AddDefaultCharset. Но я думаю, что дело не в том как выводит сервер и принимает броузер, а в том как php читает из текстовика.Там творится куча пакостей, например теряется часть слова, обычно конец. Разве сервер на это влияет?
Неизвестный
05.12.2006, 12:34
общий
Ваш скрипт обрабатывается нормально. Только что один в один сохранил у себя, вбил в menu.txt виндовый текст и на странице точно также в кодировке 1251 воспроизвёлся. Как Вам уже писали, добавьте в httpd.conf строки:AddDefaultCharset WINDOWS-1251иAddCharset WINDOWS-1251 .cp-1251 .win-1251Это единственные, которые добавлял для правильной обработки кодировок веб-сервером.
Неизвестный
05.12.2006, 13:01
общий
Извините, уточните пожалуйста в какую директиву вписывать. Так просто не прокатило.Вышло так (в прочем ничего нового):главпаталдадмиЭто получилось из текста файлаtopic/main главнаяhelp/help помощьcatalogue/themes1 каталогtopic/upload добавитьadmin/administration администрированиеМожет чего нужно в php.ini прописать? У меня там написаноdefault_charset = "win-1251"это немного помогло, без него были вообще вопросики: "???????".Я вот сам удивляюсь вчём здесь глюк. В первую очередь конечно про родственников мелкософта вспоминаю. Но причем здесь вообще форточки?И ведь всё везде работает нормально, все символы показывает как надо. Даже из mysql русские буквы читаю и пишу. А опции апача, как понимаю, просто рекомендуют броузеру выбирать определенную кодировку. Никакими перекодировками там даже и не пахнет.У меня вообще конфиг из денвера спёрт. Может в этом проблема?
Неизвестный
06.12.2006, 16:28
общий
Ни в какой директиве. Указанные мной две строки параметров размещаются в основном блоке настроек httpd.conf:AddDefaultCharset windows-1251 непосредственно предшествует второй указанной мной (а она идёт среди перечня других аналогичных кодировок - поищите по первым символам местонахождение).При этом в моём php.ini указанный Вами параметр был и остаётся закомментированным, а других там касательно кодировок нет.Вообще же рекомендую взять установочный пакет апача для той ОС, в которой он у Вас стоит, и, вытащив пример конфига, пройтись по нему всему и настроить под данную систему.
Неизвестный
06.12.2006, 16:39
общий
Да я уже по всякому пробовал и коментировал и разкоментировал. Это не апач однозначно, это php уже совершенно точно. Поскольку не только fscanf глючит. Там ещё есть функции для перевода в html мнемоники htmlentities, так вот она мне такую фигню выдала, что ни всказке рассказать, разве что только перерисовать.А что касается fscanf, латиницу читает и хорошо, остальную инфу закинул в php массив, работает и ладно. Мне уже надоело. Хотя конечно на будущее хотелось бы исправить глюк.
Неизвестный
06.12.2006, 17:17
общий
При такой уверенности могу лишь порекомендовать взять исходники php и пересобрать пакет для себя.
Неизвестный
06.12.2006, 17:23
общий
На это чаму не хватит. Я не имею понятия, что там к чему. Работает и то хорошо.
давно
Советник
419
1011
09.12.2006, 05:00
общий
Обратите внимание на setlocale(LC_CTYPE,"ru_RU.KOI8-R");setlocale(LC_ALL,"ru_RU.KOI8-R");
Неизвестный
09.12.2006, 05:44
общий
Ув, Евгений Иванов. Пожалуйста объясните по подробнее! Я так понял мне нужно писать, в начале скрипта, так:setlocale(LC_ALL,"ru_RU.win");А эта строчка тоже нужна или нет?setlocale(LC_CTYPE,"ru_RU.win");или вообще писать "ru_RU.win" неверно?Что-то я в справочнике плохо понял. Там ссылки на MSDN, а с ним у меня тоже туго.
давно
Советник
419
1011
09.12.2006, 05:47
общий
setlocale(PHP 3, PHP 4, PHP 5)setlocale -- Устанавливает локальОписаниеstring setlocale ( mixed category, string locale [, string ...] )string setlocale ( mixed category, array locale )category - строка или константа, задающая категорию функций, на которые будет влиять установка локали: LC_ALL - все функции LC_COLLATE - функции сравнения строк, см. strcoll() LC_CTYPE - функции преобразования строк, например strtoupper() LC_MONETARY - функция localeconv() LC_NUMERIC - задает символ десятичной точки (см. также localeconv()) LC_TIME - форматирование дат функцией strftime()
давно
Советник
419
1011
09.12.2006, 05:51
общий
писать нужно ru_RU.CP1251илиRussian_Russia.CP1251
Форма ответа