我正在一个用户可以在英语和法语之间切换的网站上工作.输出帖子的日期.
如果用户选择法语我使用:
setlocale(LC_ALL, 'fra_fra');
Run Code Online (Sandbox Code Playgroud)
然后输出我使用的日期:
strftime('%d %B %Y', strtotime($post->post_date));
Run Code Online (Sandbox Code Playgroud)
我在utf-8上有我的字符集:
<meta charset="utf-8">
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是像û这样的字符和其他带有重音符号的字符只显示为带有问号的黑色钻石.
有没有办法来解决这个问题?
jer*_*oen 64
这似乎是该strftime
功能的问题/错误.
您可以使用以下方法解决
$date_string = utf8_encode(strftime('%d %B %Y', strtotime($post->post_date)));
Run Code Online (Sandbox Code Playgroud)
And*_*e F 13
Content-Type标头需要将代码页设置为UTF-8.
header('Content-Type: text/html; charset=UTF-8');
Run Code Online (Sandbox Code Playgroud)
由于在使用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));
?>
Run Code Online (Sandbox Code Playgroud)
dec*_*eze 10
语言环境有不同的编码!您使用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
Run Code Online (Sandbox Code Playgroud)
然后选择您所在语言环境的UTF-8变体,例如:
setlocale(LC_ALL, 'fr_FR.UTF-8');
Run Code Online (Sandbox Code Playgroud)
如果您没有可用的语言环境的UTF-8变体,请查阅操作系统的帮助系统如何安装它,或者在PHP中进行编码转换.
<?php
date_default_timezone_set('Europe/Istanbul');
setlocale(LC_TIME,"turkish");
echo date("d.m.Y").' - '.iconv("ISO-8859-9","UTF-8",strftime('%A'));
?>
Run Code Online (Sandbox Code Playgroud)
// 11.06.2015 - Per?embe