Hello.

I have noticed that, in C locale, %lc prints nothing if the first byte
of the argument is non-ASCII (0x80-0xff).

This is the only way %...c can ever output 0 bytes in bash, so it is
probably unintenional.

    $ LC_ALL=C; { printf %lc%n è x; declare -p x >&2;} | od -An -to1
    declare -- x="0"
    $ LC_ALL=C; { printf %lc%n $'\x80' x; declare -p x >&2;} | od -An -to1
    declare -- x="0"
    $ LC_ALL=C; { printf %lc%n 1$'\x80' x; declare -p x >&2;} | od -An -to1
    declare -- x="1"
     061

I would expect %lc in C locale to work like %c, so print the first byte
of the argument; that is ksh93's %Lc does.

    $ LC_ALL=C; { printf %Lc%n è x; typeset -p x >&2;} | od -An -to1
    typeset -i x=1
     303

%.1ls has a similar problem.
It appears that it will print nothing if there is a non-ASCII byte
anywhere in the string when using %ls, or anywhere in first N bytes when
using %.Nls.

    $ LC_ALL=C; { printf %ls%n 1fooèax x; declare -p x >&2;} | od -An -to1
    declare -- x="0"
    $ LC_ALL=C; { printf %.3ls%n 1fooèax x; declare -p x >&2;} | od -An -to1
    declare -- x="3"
     061 146 157
    $ LC_ALL=C; { printf %.7ls%n 1fooèax x; declare -p x >&2;} | od -An -to1
    declare -- x="0"

I would also expect %ls to work like %s in C locale; again, that is what
ksh93's %Ls does.

o/
 emanuele6

Reply via email to