Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Smarty + utf-8 + Windows + setlocale = как подружить?
Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2010
Помог: 0 раз(а)
Всем привет!
Подскажите плиз как вывести локаль в utf-8 на винде?
Уже облазил много форумов но ответа так и не нашел.
Нижеследующее работает только для *nix систем:
Говорят что надо использовать функцию mb_convert_encoding или iconv для конвертации, т.к. 5-й пхп сохраняет строки в однобитовом представлении а для utf8 надо больше места
И вот тут уже не понятно где использовать функцию конвертации.
Может кто встречался уже с этим, может у кого есть более гибкое решение - буду благодарен за любую предоставленную информацию!
JustUserR
Отправлено: 07 Января, 2010 - 21:59:09
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Простите а почему UTF8 с указанием ru_RU идет - может быть просто utf8 надо указать
При этом важно не забывать согласовывать это с кодировкой самого файла - в том числе кодировкой шаблонов smarty - иначе их содержимое нужно будет поргонять через iconv (Хотя можно чтобы каждый раз не прогонять положить в кеш)
Есди вышеуказанное не поможет можете просто взять таблицы перекодировки и перекодировать вручную заменой
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
alpha_beta
Отправлено: 07 Января, 2010 - 22:28:34
Новичок
Покинул форум
Сообщений всего: 48
Дата рег-ции: Дек. 2009
Помог: 0 раз(а)
На вскидку: все писать сразу в utf-8 (и шаблоны, и php-код).
В php-коде в заголовок запихнуть
Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2010
Помог: 0 раз(а)
alpha_beta пишет:
На вскидку: все писать сразу в utf-8 (и шаблоны, и php-код).
В php-коде в заголовок запихнуть
Всё в utf-8, пишу в эклипсе, charset=utf-8 тоже в шапке стоит.
JustUserR пишет:
При этом важно не забывать согласовывать это с кодировкой самого файла - в том числе кодировкой шаблонов smarty - иначе их содержимое нужно будет поргонять через iconv (Хотя можно чтобы каждый раз не прогонять положить в кеш)
Я был бы очень признателен если бы вы объяснили как это сделать. Спасибо.
alpha_beta
Отправлено: 07 Января, 2010 - 23:17:43
Новичок
Покинул форум
Сообщений всего: 48
Дата рег-ции: Дек. 2009
Помог: 0 раз(а)
City, прикрепи php файл и smarty шаблон - погоняю на WinXP SP3. Может получится что.
City
Отправлено: 08 Января, 2010 - 11:16:25
Новичок
Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2010
Помог: 0 раз(а)
alpha_beta пишет:
City, прикрепи php файл и smarty шаблон - погоняю на WinXP SP3. Может получится что.
Там много прикреплять прийдется, сайт на зенде, всё через него завязано, модель MVC
alpha_beta
Отправлено: 08 Января, 2010 - 11:32:46
Новичок
Покинул форум
Сообщений всего: 48
Дата рег-ции: Дек. 2009
Помог: 0 раз(а)
Проверил на WinXP - все работает без всяких хитрых преобразований. Пример во вложении. Вероятно проблема в Zend (стоит поискать в его коде вызовы смены кодировок).
Мой пример во вложении.
P.S. php 5.2.8, Apache 2.2.14, WinXP SP3, IE7.
Результат - без setlocale (LC_ALL, 'rus_RUS'); - название месяцев на английском.
с setlocale (LC_ALL, 'rus_RUS'); - крякозябли - если в браузере поменять кодировку в этом случае на 1251 - месяцы на русском - всё остальное крякозябли :(((
Покинул форум
Сообщений всего: 48
Дата рег-ции: Дек. 2009
Помог: 0 раз(а)
City
Цитата:
(можно на ты?)
, да.
На самом деле это проблема php.
Если заглянуть в код smarty, то мы увидим, что там вызывается всего лишь навсего strftime. Что навело меня на мысль проверить сам php. Для этого я создал вот такой файл
В ответ получил квадратики. Значит - гипотеза косяка в php оказалась верна. Далее, беглый поиск по интернету привел вот к этой статье - http://anton-pribora[dot]ru/articles/php/locales , в которой говорится
Цитата:
Единственная кодировка, с которой у меня возникли проблемы, как ни странно, оказалась UTF-8. При попытке выставить эту кодировку, выставляются все категории локалей, кроме основной. Вывод локализованных сообщений при этом идёт в cp1251.
Пока это можно списать на внутренний механизм PHP работы со строками. С шестой версии PHP вся обработка строк должна будет вестись в UTF-8, но до тех пор надо просто знать об этом и делать поправку.
JustUserR
Отправлено: 08 Января, 2010 - 13:02:37
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
City пишет:
Я был бы очень признателен если бы вы объяснили как это сделать. Спасибо.
Все дело в том что при прямом считывании файла (Хотя include хоть fopen) он будет считываться "как есть" причем его кодировка будет считываться согласно кодировке самого PHP-скрипта - поэтому общий порядок действий примерно такой
1 Мы знаем кодировку исходного кода самого PHP-скрипта и в соответствии с ней устанавливаем локаль setlocace (Для внутренних функций PHP) и устанавливаем тот же Charset в заголовке Content-type (В некоторых случаях можно добавить тег <meta>
2 Считываем нужный нам шаблон и перекодируем его в ту же кодировку с помощью iconv (Если у нас юникод то mb_convert_string - тут можно попробовать использовать ту или иную функцию)
3 Не забывать использовать для шаблона с юникодом использовать функции типа mb_***
4 Если не поможет то проблема скорее всего в том что некорректно работает iconv - в таком случае лучше использовать кодировочно-независимые таблицы перекодировки (Независимые потому что в них номера символов а не сами символы) и с помощь string_translate производить перекодировку
5 Вероятно ваш web-сервер не поддерживает изменение заголовка кодировки с помощью content-type - тогда можно попробовать написать NPH-скрипт для полного контроля заголовков и проверки
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
City
Отправлено: 08 Января, 2010 - 13:09:59
Новичок
Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2010
Помог: 0 раз(а)
alpha_beta пишет:
беглый поиск по интернету привел вот к этой статье - http://anton-pribora.ru/articles/php/locales
Я вчера читал эту статью, да там говориться что есть проблема, но как её решать нет. (Добавление)
JustUserR пишет:
2 Считываем нужный нам шаблон и перекодируем его в ту же кодировку с помощью iconv (Если у нас юникод то mb_convert_string - тут можно попробовать использовать ту или иную функцию)
Спасибо.
А что можно целый шаблон переконвертировать? Я думал только строку.
Пытался вот так, но не получилось:
Покинул форум
Сообщений всего: 48
Дата рег-ции: Дек. 2009
Помог: 0 раз(а)
City, решение есть, но это будут копец какие костыли, напр. правка файлов smarty и построение месяцев не из системы, а по заранее построенному массиву или вывод в 1251, а потом перекодировка на лету (что то не соображу быстро, как это сделать).
По статье видно, что человек разобрался в теме досконально, и поскольку решения он не привел, то видимо пока остается ставить костыли :(
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.