我正在开发一个用户可以在英语和法语之间切换的网站。输出帖子的日期。
如果用户选择法语我使用:
setlocale(LC_ALL, 'fra_fra');
然后输出我使用的日期:
strftime('%d %B %Y', strtotime($post->post_date));
我在utf-8上有我的字符集:
<meta charset="utf-8">
我遇到的问题是像û这样的字符,其他带有重音符号的字符只显示为带有问号的黑色钻石。
有没有办法解决这个问题?
答案 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)))