Ответ 1
Кажется, это проблема/ошибка с помощью функции strftime
.
Вы можете решить эту проблему, используя:
$date_string = utf8_encode(strftime('%d %B %Y', strtotime($post->post_date)));
Я работаю над сайтом, на котором пользователь может переключаться между английским и французским. Для вывода даты сообщений.
Если пользователь выбирает французский, я использую:
setlocale(LC_ALL, 'fra_fra');
Затем для вывода даты, которую я использую:
strftime('%d %B %Y', strtotime($post->post_date));
У меня есть charset на utf-8 с:
<meta charset="utf-8">
У меня есть такие символы, как û, а другие с акцентами отображаются только как черные бриллианты с вопросительными знаками.
Есть ли способ исправить это?
Кажется, это проблема/ошибка с помощью функции strftime
.
Вы можете решить эту проблему, используя:
$date_string = utf8_encode(strftime('%d %B %Y', strtotime($post->post_date)));
Заголовок Content-Type должен установить кодовую страницу в UTF-8.
header('Content-Type: text/html; charset=UTF-8');
Поскольку вы не можете изменить заголовок, как только вы выведете что-либо на страницу с помощью echo или print, убедитесь, что вы установили его на ранней стадии страницы.
Кодовая страница ASCII полностью содержится в UTF-8, а не наоборот.
Замените заголовок UTF-8 на ASCII, и вы увидите, что произойдет, когда символы не будут включены в текущую кодовую страницу.
<?php
header('Content-Type: text/html; charset=UTF-8');
//header('Content-Type: text/html; charset=ASCII');
$myDate = "Feb 23, 2011";
$locale = 'fr_FR.UTF-8';
setlocale(LC_ALL, $locale);
echo strftime('%d %B %Y', strtotime($myDate));
$locale = 'en_US.UTF-8';
setlocale(LC_ALL, $locale);
echo strftime('%d %B %Y', strtotime($myDate));
?>
Локали приходят в разных кодировках! Вы рекламируете свой сайт с использованием UTF-8, но strftime
не возвращает кодированную строку UTF-8, потому что выбранный вами язык не является языковым стандартом UTF-8. Проверьте вашу систему, какие у вас есть, например:
$ locale -a | grep fr_FR
fr_FR
fr_FR.ISO8859-1
fr_FR.ISO8859-15
fr_FR.UTF-8
Затем выберите вариант UTF-8 вашей локали, например:
setlocale(LC_ALL, 'fr_FR.UTF-8');
Если у вас нет варианта вашей локали UTF-8, либо обратитесь в справочную систему вашей ОС, как ее установить, либо выполните преобразование кодировки в PHP.
Если вы показываете свою страницу с помощью кодировки utf8, вы хотите получить utf8 из strftime.
Если php charset - utf8, тогда вы готовите. Если нет, вы можете:
utf8encode()
вывод strftime.
добавить '.utf8'
к вашему языку, если эта локаль установлена в вашей системе, как в setlocale(LC_ALL, 'fr_FR.utf8')
измените charset по умолчанию php, поместив строку AddDefaultCharset UTF-8
в ваш php.ini
или ваш .htaccess
<?php
date_default_timezone_set('Europe/Istanbul');
setlocale(LC_TIME,"turkish");
echo date("d.m.Y").' - '.iconv("ISO-8859-9","UTF-8",strftime('%A'));
?>
//11.06.2015 - Першумбе
Вы добавили это в заголовок?
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
Была эта проблема, но header()
, utf8_encode()
и setlocale()
не работали, и мы не знали фактическую кодировку. Вот как мы решили это (если это кому-нибудь поможет):
// $date_start is a DateTime instance
$month = strftime("%b", $date_start->getTimestamp());
// The default value for the 3rd argument is FALSE, this can cause issues
$encoding = mb_detect_encoding($month, 'auto', true);
// We can now correctly convert the string to UTF-8
$converted = mb_convert_encoding($month, 'UTF-8', $encoding);
Примечание: utf8_encode предполагает кодирование только из строки в кодировке ISO-8859-1.
Руководство:
utf8_encode(strftime('%e %B %Y', $this->createDate->getTimestamp()))
не работает для меня
class DateUtil
{
const FORMAT_DAY_OF_WEEK = '%A';
const FORMAT_HUMANY = '%e %B %Y';
private static $monthInGenitiveCase = [
'01' => 'января',
'02' => 'февраля',
'03' => 'марта',
'04' => 'апреля',
'05' => 'мая',
'06' => 'июня',
'07' => 'июля',
'08' => 'августа',
'09' => 'сентября',
'10' => 'октября',
'11' => 'ноября',
'12' => 'декабря'
];
public static function dow(DateTime $date)
{
return self::format($date, self::FORMAT_DAY_OF_WEEK);
}
public static function humany(DateTime $date)
{
return self::format($date, '%e ') .self::$monthInGenitiveCase[self::format($date, '%m')] .self::format($date, ' %Y');
}
public static function format(DateTime $date, $format)
{
return strftime($format, $date->getTimestamp());
}
}
использование
DateUtil::humany($this->createDate)
Конечно, это работает только для одного языка, но в некоторых случаях этого достаточно.