Настройка локали в php под windows для работы с UTF-8?

Ситуация следующая:

Создаём файл index.php в кодировке UTF-8 без BOM c таким содержанием:
<?php
header('Content-Type: text/html; charset=UTF8');
var_dump(strftime('Число: %d, месяц: %B, день недели: %A'));
die();
?>


И запускаем скрипт под Windows.


Я получаю следующий вывод:
Число: 19, месяц: ������, день недели: �����������

Иногда слетает на такое:
Число: 19, месяц: November, день недели: Monday


Принудительное выставление локали
setlocale(LC_ALL, 'ru_RU.UTF-8', 'Russian_Russia.65001');
так же ничего не меняет.


однако если у файла кодировка Windows-1251, то никаких проблем не происходит.

Кто-то может подсказать как решить сию проблему?


Обязательно требование сохранить кодировку у файлов UTF-8 и заставить Windows нормально с ними работать. Это реально?


Конфигурация:

ОС: Windows 7

PHP: 5.4.4

Apache: 2.2.13
  • Вопрос задан
  • 17231 просмотр
Решения вопроса 1
burdakovd
@burdakovd
Говорят под Windows strftime кладёт на выбранную кодировку в локали и работает в однобайтовой кодировке, соответствующей запрошенному языку.

Можно, разве что, перед каждыми подобными функциями (переключив на всякий случай локаль на знакомую винде), перекодировать ввод функции в однобайтную кодировку, вызывать ей, после чего перекодировать результат в utf-8.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
@id_zhigunov
Web Developer
setlocale(LC_ALL, "russian");
$day = strftime('%a');
$mon = strftime('%B');
$day = iconv("windows-1251", "UTF-8", $day);
$mon = iconv("windows-1251", "UTF-8", $mon);
Ответ написан
Urvin
@Urvin
<?
$days = array('Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье');
$months = array('Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь');

$nowdate = getdate();

echo 'Число: ', $nowdate['mday'], ', месяц: ', $months[$nowdate['mon']-1], ', день недели: ', $days[$nowdate['wday']-1];
?>
Ответ написан
Комментировать
А при чем тут виндовс вообще? Вы сами даете функции на вход UTF-8 и удивляетесь, что у вас на выходе не win-1251. Хотите на выходе 1251, так и на вход давайте его же, хоть через тот же iconv.
Ответ написан
@edogs
Посмотрите браузером какой контент_тайп _реально_ отдается сервером.
Вполне возможно что какие-то настройки оверрайдят Вашу попытку отдать utf8, например www.php.net/manual/ru/ini.core.php#ini.default-charset или какие-то настройки сервера. А дальше разбирайтесь по ситуации, ищите что и где меняет.
Ответ написан
NikitaTratorov
@NikitaTratorov
CTO
Увы нет. Не реально. Из-за сервера на Windows придется писать отдельную функцию-обертку для любых случаев работы с датами, валютами и т.п.

Пример
if ( stripos($u_locale, "1251") !== false ) {
	return iconv("windows-1251","utf-8", $date_str);
} elseif (stripos($u_locale, "1252") !== false) {
	return iconv("windows-1252","utf-8", $date_str);
} else {
	return $date_str;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы