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 = как подружить?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
City
Отправлено: 07 Января, 2010 - 20:00:37
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Всем привет!
Подскажите плиз как вывести локаль в utf-8 на винде?
Уже облазил много форумов но ответа так и не нашел.
Нижеследующее работает только для *nix систем:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. setlocale (LC_ALL, 'ru_RU.utf-8', 'rus_RUS.utf-8', 'ru_RU.utf8');
  3.  

Говорят что надо использовать функцию mb_convert_encoding или iconv для конвертации, т.к. 5-й пхп сохраняет строки в однобитовом представлении а для utf8 надо больше места Улыбка

iconv(”кодировка_откуда”, “кодировка_куда”, строка)
mb_convert_encoding(строка, “кодировка_куда”, “[кодировка_откуда]“).

Вроде бы понятно.
Но я пишу шаблон в смарти а там он имеет вид:
CODE (text):
скопировать код в буфер обмена
  1.  
  2.     <div class="row" id="form_date_container">
  3.         <label for="form_date">дата создания:</label>
  4.  
  5.         {html_select_date prefix='ts_created'
  6.                           time=$fp->ts_created
  7.                           start_year=-5
  8.                           end_year=+5
  9.                           month_format=%B}
  10.  
  11.         {html_select_time prefix='ts_created'
  12.                           time=$fp->ts_created
  13.                           display_seconds=false
  14.                           use_24_hours=true}
  15.  
  16.         {include file='lib/error.tpl' error=$fp->getError('date')}
  17.     </div>
  18.  


И вот тут уже не понятно где использовать функцию конвертации.
Может кто встречался уже с этим, может у кого есть более гибкое решение - буду благодарен за любую предоставленную информацию!
 
 Top
JustUserR
Отправлено: 07 Января, 2010 - 21:59:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




City пишет:
setlocale (LC_ALL, "ru_RU.utf-8", "rus_RUS.utf-8", "ru_RU.utf8");
Простите а почему UTF8 с указанием ru_RU идет - может быть просто utf8 надо указать
При этом важно не забывать согласовывать это с кодировкой самого файла - в том числе кодировкой шаблонов smarty - иначе их содержимое нужно будет поргонять через iconv (Хотя можно чтобы каждый раз не прогонять положить в кеш)
Есди вышеуказанное не поможет можете просто взять таблицы перекодировки и перекодировать вручную заменой


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
alpha_beta
Отправлено: 07 Января, 2010 - 22:28:34
Post Id


Новичок


Покинул форум
Сообщений всего: 48
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




На вскидку: все писать сразу в utf-8 (и шаблоны, и php-код).
В php-коде в заголовок запихнуть
PHP:
скопировать код в буфер обмена
  1. header("Content-type: text/html; charset=utf-8");

(Отредактировано автором: 07 Января, 2010 - 22:28:54)

 
 Top
City
Отправлено: 07 Января, 2010 - 23:08:29
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




alpha_beta пишет:
На вскидку: все писать сразу в utf-8 (и шаблоны, и php-код).
В php-коде в заголовок запихнуть


Всё в utf-8, пишу в эклипсе, charset=utf-8 тоже в шапке стоит.
JustUserR пишет:
При этом важно не забывать согласовывать это с кодировкой самого файла - в том числе кодировкой шаблонов smarty - иначе их содержимое нужно будет поргонять через iconv (Хотя можно чтобы каждый раз не прогонять положить в кеш)

Я был бы очень признателен если бы вы объяснили как это сделать. Спасибо.
 
 Top
alpha_beta
Отправлено: 07 Января, 2010 - 23:17:43
Post Id


Новичок


Покинул форум
Сообщений всего: 48
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




City, прикрепи php файл и smarty шаблон - погоняю на WinXP SP3. Может получится что.
 
 Top
City
Отправлено: 08 Января, 2010 - 11:16:25
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




alpha_beta пишет:
City, прикрепи php файл и smarty шаблон - погоняю на WinXP SP3. Может получится что.

Там много прикреплять прийдется, сайт на зенде, всё через него завязано, модель MVC
 
 Top
alpha_beta
Отправлено: 08 Января, 2010 - 11:32:46
Post Id


Новичок


Покинул форум
Сообщений всего: 48
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




Проверил на WinXP - все работает без всяких хитрых преобразований. Пример во вложении. Вероятно проблема в Zend (стоит поискать в его коде вызовы смены кодировок).
Мой пример во вложении.
P.S. php 5.2.8, Apache 2.2.14, WinXP SP3, IE7.
Скачать файл: utf.zip
Скачан раз: 222

(Отредактировано автором: 08 Января, 2010 - 11:35:25)

 
 Top
City
Отправлено: 08 Января, 2010 - 12:30:59
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




alpha_beta пишет:
Проверил на WinXP

Спасибо!
alpha_beta пишет:
все работает без всяких хитрых преобразований

Взял твой пример(можно на ты?) и добавил свои строки, получил:
PHP:
скопировать код в буфер обмена
  1.  
  2. <html>
  3. <head>
  4. <title>Заголовок</title>
  5. </head>
  6. <body>
  7. Ниже текст из php<br>
  8. <i>{$text}</i>
  9.  
  10.         <div class="row" id="form_date_container">
  11.         <label for="form_date">дата создания:</label>
  12. {php}
  13. setlocale (LC_ALL, 'rus_RUS');
  14. {/php}
  15.         {html_select_date prefix='ts_created'
  16.                           time=$fp->ts_created
  17.                           start_year=-5
  18.                           end_year=+5
  19.                           month_format=%B}
  20.  
  21.         {html_select_time prefix='ts_created'
  22.                           time=$fp->ts_created
  23.                           display_seconds=false
  24.                           use_24_hours=true}
  25.  
  26.     </div>
  27. </body>
  28. </html>
  29.  


Результат - без setlocale (LC_ALL, 'rus_RUS'); - название месяцев на английском.
с setlocale (LC_ALL, 'rus_RUS'); - крякозябли - если в браузере поменять кодировку в этом случае на 1251 - месяцы на русском - всё остальное крякозябли :(((

Прикрепил файл:
Скачать файл: utf.zip
Скачан раз: 183
 
 Top
alpha_beta
Отправлено: 08 Января, 2010 - 13:00:02
Post Id


Новичок


Покинул форум
Сообщений всего: 48
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




City
Цитата:
(можно на ты?)
, да.

На самом деле это проблема php.

Если заглянуть в код smarty, то мы увидим, что там вызывается всего лишь навсего strftime. Что навело меня на мысль проверить сам php. Для этого я создал вот такой файл
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.         setlocale (LC_ALL, 'rus_Rus');
  4.         $text = 'Привет мир!'.strftime ('%B');
  5.         echo $text;
  6. ?>
  7.  

В ответ получил квадратики. Значит - гипотеза косяка в php оказалась верна. Далее, беглый поиск по интернету привел вот к этой статье - http://anton-pribora[dot]ru/articles/php/locales , в которой говорится
Цитата:
Единственная кодировка, с которой у меня возникли проблемы, как ни странно, оказалась UTF-8. При попытке выставить эту кодировку, выставляются все категории локалей, кроме основной. Вывод локализованных сообщений при этом идёт в cp1251.

Пока это можно списать на внутренний механизм PHP работы со строками. С шестой версии PHP вся обработка строк должна будет вестись в UTF-8, но до тех пор надо просто знать об этом и делать поправку.
 
 Top
JustUserR
Отправлено: 08 Января, 2010 - 13:02:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 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/
 
 Top
City
Отправлено: 08 Января, 2010 - 13:09:59
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




alpha_beta пишет:
беглый поиск по интернету привел вот к этой статье - http://anton-pribora.ru/articles/php/locales

Я вчера читал эту статью, да там говориться что есть проблема, но как её решать нет.
(Добавление)
JustUserR пишет:
2 Считываем нужный нам шаблон и перекодируем его в ту же кодировку с помощью iconv (Если у нас юникод то mb_convert_string - тут можно попробовать использовать ту или иную функцию)

Спасибо.
А что можно целый шаблон переконвертировать? Я думал только строку.
Пытался вот так, но не получилось:
PHP:
скопировать код в буфер обмена
  1.  
  2.       {php}
  3.         setlocale (LC_ALL, 'rus');
  4.         mb_convert_encoding(html_select_date, 'UTF-8');
  5.         {/php}
  6.         {html_select_date prefix='ts_created'
  7.                           time=$fp->ts_created
  8.                           start_year=-5
  9.                           end_year=+5
  10.                           month_format=%B}
  11.  
 
 Top
alpha_beta
Отправлено: 08 Января, 2010 - 13:32:06
Post Id


Новичок


Покинул форум
Сообщений всего: 48
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




City, решение есть, но это будут копец какие костыли, напр. правка файлов smarty и построение месяцев не из системы, а по заранее построенному массиву или вывод в 1251, а потом перекодировка на лету (что то не соображу быстро, как это сделать).

По статье видно, что человек разобрался в теме досконально, и поскольку решения он не привел, то видимо пока остается ставить костыли :(
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB