我正在尝试使用 strftime
和法语区域设置来格式化日期LC_TIME
.我有一个编码问题,不是日期本身,而是格式字符串。
让我解释一下;在我的例子中,$format
是%A %d %B à %Hh%M
的,$time
日期是八月的某个地方。
我首先从这个开始:strftime($format, $time)
,它给了我Vendredi 05 Ao�t à 11h57
。
我想解决编码问题,所以我做了这个:utf8_encode(strftime($format, $time))
,这给了我这个:Vendredi 05 Août à 11h57
。
您可以看到août
上的编码问题消失了,但格式字符串的à
上出现了一个编码问题。
我该如何解决这个问题?我必须做utf8_encode(strftime("%A %d %B", $time)) . " à " . utf8_encode(strftime("%Hh%M", $time))
还是有更清洁的方法?
谢谢!
鉴于上面的输出示例,我猜您的源文件是 UTF-8(因此à
是 UTF-8 编码的(,并且您的输出 HTML 也使用 UTF-8 字符集发送。问题似乎是您使用的是非 UTF-8 法语区域设置,因此从 strftime()
返回的字符串不是 UTF-8,而是类似于 ISO-8859-1 或 ISO-8859-15 的内容。
因此,要么坚持使用繁琐的方法,仅将部分结果字符串转换为 UTF-8(utf8_encode(strftime("%A %d %B", $time)) . " à " . utf8_encode(strftime("%Hh%M", $time))
,要么选择法语区域设置的 UTF-8 变体。在Linux上,这应该是类似 fr_FR.UTF-8
.
以下内容适用于Mac OS X(附带PHP 5.5(:
<?php
setlocale(LC_TIME, 'fr_FR.UTF-8');
echo strftime('%A %d %B à %Hh%M', strtotime('2016-08-12 12:00:00'));
// Vendredi 12 août à 12h00
还要检查在命令行上运行locale -a
的系统支持的局部变量。
解决方案是使用 fr_FR.UTF-8
区域设置并删除对 utf8_encode
的调用,因为它不再需要。