squentin has asked for the wisdom of the Perl Monks concerning the following question:
How do I get a utf8 time string using POSIX::strftime ?
When using a utf8 locale, for example fr_FR.utf8, the output of POSIX::strftime is encoded in utf8 but without the utf8 flag on, ie: returns a byte string and not a character string. So when using utf8::upgrade on it (what the gtk2 bindings do), or when printing it to a file using ">:utf8", the non-ascii characters become garbage.
And of course, when using a non-utf8 locale such as fr_FR, the return value of POSIX::strftime is encoded in a locale specific encoding.
So what is the best way to get a proper utf8 string ? Do I really have to look at the locale value myself to know how to convert the string ?
Shouldn't that behavior be considered a bug ? (though probably hard to fix without breaking some existing programs) It should at least be mentioned in the documentation.
example code:
use POSIX "strftime"; my $s=strftime("%c",localtime); open my($fh),">","without_utf8"; printf $fh $s; open my($fh2),">:utf8","with_utf8"; printf $fh2 $s;
- result with locale fr_FR.utf8 :
- "without_utf8" contains the correct utf8 date
- "with_utf8" contains a date with a garbled "Août" (french for August)
- result with locale fr_FR
- "without_utf8" contains the date encoded in ISO-8859
- "with_utf8" contains the correct utf8 date
(tested with perl v5.10.1 and v5.12.1)
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: POSIX::strftime encoding
by Khen1950fx (Canon) on Aug 25, 2010 at 06:20 UTC | |
by squentin (Sexton) on Aug 25, 2010 at 12:43 UTC | |
Re: POSIX::strftime encoding
by squentin (Sexton) on Sep 01, 2010 at 22:07 UTC |