This is the mail archive of the
cygwin
mailing list for the Cygwin project.
Re: [1.7] bug in printf and %ls
- From: Alexey Borzenkov <snaury at gmail dot com>
- To: cygwin at cygwin dot com
- Date: Fri, 15 May 2009 13:30:12 +0400
- Subject: Re: [1.7] bug in printf and %ls
On Fri, May 15, 2009 at 11:43 AM, Alexey Borzenkov <snaury@gmail.com> wrote:
> I'm in a domain at work and previously used mkpasswd -d and mkgroup -d
> to populate /etc/passwd and /etc/group files. Unfortunately, we mostly
> use Russian versions of Windows (especially on servers) here and most
> built-in user and group names (like Administrator, Domain Users, etc.)
> are localized. With cygwin 1.5 these names were successfully exported
> by mkpasswd/mkgroup, however with cygwin 1.7 all such usernames are
> silently ignored and don't appear in the output.
And I found why. It appears that there's a bug in printf with %ls that
will refuse to print the string completely if the wide string for %ls
cannot be represented in current charset. It's interesting that
sometimes it behaves differently. For example:
$ mkpasswd -C
NDGAMES\aborzenkov:unused:11721:10513:U-NDGAMES\aborzenkov,*sidremoved*:/home/aborzenkov:/bin/bash
$ mkgroup -C
NDGAMES\
Notice that in the second case it somehow managed to print domain name
and separator before failing.
Another example:
#include <stdio.h>
#include <locale.h>
int main(int argc, char** argv)
{
setlocale(LC_ALL, "en_US.CP1252");
printf("'%ls'", L"\u0410\u0411\u0412");
return 0;
}
Prints nothing, i.e. it doesn't print neither of single quotes. If it
couldn't represent those characters, I think it should either ignore
them, or try to display them with SO-UTF-8. Making printf call fail
like that is, imho, really unexpected.
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/