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