natinusala natinusala - 7 months ago 31
PHP Question

strftime encoding issue within format string

I'm trying to format dates using

strftime
and a French locale for
LC_TIME
. I've got an encoding issue, not for the dates themselves but within the format string.

Let me explain ; in my examples,
$format
is
%A %d %B à %Hh%M
and the
$time
date is somewhere in august.

I first started with this :
strftime($format, $time)
, and it gave me
Vendredi 05 Ao�t à 11h57
.

I wanted to solve the encoding problem, so I did this :
utf8_encode(strftime($format, $time))
, which gave me this :
Vendredi 05 Août à 11h57
.

You can see that the encoding problem on
août
is gone, but one has appeared on the
à
of the format string.

How may I fix this ? Do I have to do
utf8_encode(strftime("%A %d %B", $time)) . " à " . utf8_encode(strftime("%Hh%M", $time))
or is there a cleaner way ?

Thanks !

Answer

Given the output examples above, I'd guess that your source file is UTF-8 (so the à is UTF-8 encoded) and your output HTML is also sent with a UTF-8 character set. The problem seems to be that you're using a non-UTF-8 French locale so the returned string from strftime() is not UTF-8 but rather something like ISO-8859-1 or ISO-8859-15.

So either you stick with the cumbersome approach of converting only parts of your result string to UTF-8 (utf8_encode(strftime("%A %d %B", $time)) . " à " . utf8_encode(strftime("%Hh%M", $time)) or you select a UTF-8 variation of the French locale. On Linux that should be something like fr_FR.UTF-8.

The following works on Mac OS X (with shipped 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

Also check the locals supported by your system running locale -a on the command line.