POSIX::strftime nevraci UTF-8?
Honza Pazdziora
adelton na fi.muni.cz
Čtvrtek Únor 2 15:23:18 MET 2006
On Thu, Feb 02, 2006 at 02:43:36PM +0100, Jan Kasprzak wrote:
> Umite nekdo prinutit POSIX::strftime(), aby vysledny text
> byly korektni znaky v UTF-8? Testovaci priklad:
>
> $ cat test.pl
> #!/usr/bin/perl -w
>
> use utf8;
> use POSIX qw(strftime setlocale);
>
> setlocale (&POSIX::LC_TIME, "cs_CZ.UTF-8");
> my $format = "%c\n";
> my $datum = strftime($format, localtime);
> print "Vystup ", utf8::is_utf8($datum) ? "Je" : "Neni", " utf-8\n";
> print join(" ", map { ord $_ > 127 ? ord $_ : $_ }
> split(//, $datum));
>
> $ ./test.pl
> Neni utf-8
> 196 140 t 194 160 2 . 194 160 195 186 n o r 194 160 2 0 0 6 , 194 160 1 4 : 3 8 : 1 9 194 160 C E T
> $
>
> Prislo by mi logicke, kdyby strftime() vracelo znaky v pripade, ze
> formatovaci retezec je znakovy, nebo tak nejak.
Neco jako (netestovano, ani nekompilovano)
--- ./ext/POSIX/POSIX.xs.orig 2006-02-02 14:52:31.000000000 +0100
+++ ./ext/POSIX/POSIX.xs 2006-02-02 15:22:13.000000000 +0100
@@ -1812,9 +1812,13 @@
int isdst
CODE:
{
+ SV *sv;
char *buf = my_strftime(fmt, sec, min, hour, mday, mon,
year, wday, yday, isdst);
if (buf) {
- ST(0) = sv_2mortal(newSVpv(buf, 0));
+ sv = newSVpv(buf, 0);
+ if (SvUTF8(fmt) && is_utf8_string(buf, strlen(buf)))
+ SvUTF8_on(sv);
+ ST(0) = sv_2mortal(sv);
Safefree(buf);
}
}
?
--
------------------------------------------------------------------------
Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
.project: Perl, mod_perl, DBI, Oracle, large Web systems, XML/XSL, ...
Only self-confident people can be simple.
Další informace o konferenci Perl