格式字符串中的 strftime 编码问题


strftime encoding issue within format string

我正在尝试使用 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 的调用,因为它不再需要。