[perl #103492] Make %n printf format work with Unicode
authorFather Chrysostomos <sprout@cpan.org>
Sun, 1 Jan 2012 07:49:01 +0000 (23:49 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Sun, 1 Jan 2012 07:49:01 +0000 (23:49 -0800)
It was using the internal byte count instead of the number of charac-
ters.  The iatter is documented.  The former is useless, even for C
code calling this, as later arguments could cause the current buffer
to be upgraded to utf8, throwing off any offsets returned.

sv.c
t/op/sprintf.t

diff --git a/sv.c b/sv.c
index 2d8039b..8b266c3 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -11001,7 +11001,7 @@ Perl_sv_vcatpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
                }
            }
            else
-               sv_setuv_mg(argsv, (UV)i);
+               sv_setuv_mg(argsv, has_utf8 ? (UV)sv_len_utf8(sv) : (UV)i);
            continue;   /* not "break" */
 
            /* UNKNOWN */
index de1079e..05fe1de 100644 (file)
@@ -437,6 +437,7 @@ __END__
 >%m<        >''<          >%m INVALID<
 >%s< >sprintf('%%n%n %d', $n, $n)< >%n 2< >Slight sneakiness to test %n<
 >%s< >$n="abc"; sprintf(' %n%s', substr($n,1,1), $n)< > a1c< >%n w/magic<
+>%s< >sprintf('%s%n', chr(256)x5, $n),$n< >5< >Unicode %n<
 >%o<        >2**32-1<     >37777777777<
 >%+o<       >2**32-1<     >37777777777<
 >%#o<       >2**32-1<     >037777777777<