Подтвердить что ты не робот

Французские символы php strftime

Я работаю над сайтом, на котором пользователь может переключаться между английским и французским. Для вывода даты сообщений.

Если пользователь выбирает французский, я использую:

setlocale(LC_ALL, 'fra_fra');

Затем для вывода даты, которую я использую:

strftime('%d %B %Y', strtotime($post->post_date));

У меня есть charset на utf-8 с:

<meta charset="utf-8">

У меня есть такие символы, как û, а другие с акцентами отображаются только как черные бриллианты с вопросительными знаками.

Есть ли способ исправить это?

4b9b3361

Ответ 1

Кажется, это проблема/ошибка с помощью функции strftime.

Вы можете решить эту проблему, используя:

$date_string = utf8_encode(strftime('%d %B %Y', strtotime($post->post_date)));

Ответ 2

Заголовок 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));
?>

Ответ 3

Локали приходят в разных кодировках! Вы рекламируете свой сайт с использованием 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.

Ответ 4

Если вы показываете свою страницу с помощью кодировки utf8, вы хотите получить utf8 из strftime.

Если php charset - utf8, тогда вы готовите. Если нет, вы можете:

  • utf8encode() вывод strftime.

  • добавить '.utf8' к вашему языку, если эта локаль установлена ​​в вашей системе, как в setlocale(LC_ALL, 'fr_FR.utf8')

  • измените charset по умолчанию php, поместив строку AddDefaultCharset UTF-8 в ваш php.ini или ваш .htaccess

Ответ 5

<?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 - Першумбе

Ответ 6

Вы добавили это в заголовок?

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

Ответ 7

Была эта проблема, но 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.

Руководство:

Ответ 8

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)

Конечно, это работает только для одного языка, но в некоторых случаях этого достаточно.