php strftime法语字符

时间:2012-01-24 20:52:41

标签: php

我正在开发一个用户可以在英语和法语之间切换的网站。输出帖子的日期。

如果用户选择法语我使用:

setlocale(LC_ALL, 'fra_fra');

然后输出我使用的日期:

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

我在utf-8上有我的字符集:

<meta charset="utf-8">

我遇到的问题是像û这样的字符,其他带有重音符号的字符只显示为带有问号的黑色钻石。

有没有办法解决这个问题?

9 个答案:

答案 0 :(得分:61)

这似乎是strftime函数的问题/错误。

您可以使用以下方法解决问题:

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

答案 1 :(得分:12)

Content-Type标头需要将代码页设置为UTF-8。

header('Content-Type: text/html; charset=UTF-8');

一旦您使用 echo print 向页面输出任何内容,就无法更改标题,请确保在页面的早期设置它。

ASCII码页完全包含在UTF-8中,反之亦然。

ASCII 替换 UTF-8 标题,您将看到当前代码页中未包含字符时会发生什么。

<?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));
?>

答案 2 :(得分:8)

语言环境有不同的编码!您使用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中进行编码转换。

答案 3 :(得分:3)

如果您使用utf8编码显示您的页面,您希望从strftime获取utf8。

如果php的字符集是utf8,那么你就是在做饭。如果没有,你可以:

  • utf8encode() strftime的输出。

  • 如果系统上安装了此区域设置,则会将'.utf8'附加到您的区域设置语句,如setlocale(LC_ALL, 'fr_FR.utf8')

  • 更改php的默认字符集,方法是将AddDefaultCharset UTF-8行放在php.ini.htaccess

答案 4 :(得分:2)

<?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 - Perşembe

答案 5 :(得分:0)

你是否在标题上添加了这个?

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

答案 6 :(得分:0)

此问题只有header()utf8_encode()&amp; 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 编码的字符串进行编码。

<强>手册

答案 7 :(得分:0)

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)

Ofcourse它仅适用于一种语言,但在某些情况下,这是不够的。

答案 8 :(得分:0)

我认为您可以使用以下功能:

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