This is the mail archive of the
cygwin-xfree
mailing list for the Cygwin XFree86 project.
Re: X11R7.5 and C.UTF-8
On Dec 3 13:16, Andy Koppe wrote:
> 2009/12/3 Thomas Dickey:
> >> From
> >> http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap07.html,
> >> §7.2:
> >>
> >> "The tables in Locale Definition describe the characteristics and
> >> behavior of the POSIX locale for data consisting entirely of
> >> characters from the portable character set and the control character
> >> set. For other characters, the behavior is unspecified."
> >>
> >> This means that characters 0..127 have to be treated as ASCII, but
> >> beyond that an implementation can do what it wants. And on Cygwin 1.7,
> >> plain "C" actually does imply UTF-8, which happily is
> >> backward-compatible with ASCII.
> >
> > That's an interpretation that so far hasn't been blessed by the standards
> > people. ?Any discussion of this topic should mention that, as a caveat.
>
> Fair point. It also means that apps are entitled to assume that "C"
> supports no more than ASCII, which is why Cygwin 1.7's default locale
> is C.UTF-8. A default locale setting based on the user's language
> selection would be better, but we don't have that (yet?).
Try the attached. Note: It has a hidden "--testloop" option...
Corinna
--
Corinna Vinschen Please, send mails regarding Cygwin to
Cygwin Project Co-Leader cygwin AT cygwin DOT com
Red Hat
#define WINVER 0x0600
#include <stdio.h>
#include <windows.h>
#include <getopt.h>
#define VERSION "1.0"
extern char *__progname;
void version () __attribute__ ((noreturn));
void usage (FILE *, int) __attribute__ ((noreturn));
void
version ()
{
printf ("%s (Cygwin) %s\n", __progname, VERSION);
exit (0);
}
void
usage (FILE * stream, int status)
{
fprintf (stream, "\n\
Usage: %s [-suU] [-l LCID]\n\
\n\
Return POSIX LANG identifier corresponding to a locale, default is the\n\
system default locale\n\
Possible options are:\n\
\n\
-s, --system return LANG for the system's default locale\n\
-u, --user return LANG for the current user's default locale\n\
-l, --lcid LCID return LANG for the LCID given as argument\n\
-U, --UTF-8 always attach .UTF-8 to LANG\n\
-h, --help this text\n\
-V, --version print the version of %s and exit\n",
__progname, __progname);
exit (status);
}
struct option longopts[] = {
{"system", no_argument, NULL, 's'},
{"user", no_argument, NULL, 'u'},
{"lcid", required_argument, NULL, 'l'},
{"UTF-8", no_argument, NULL, 'U'},
{"help", no_argument, NULL, 'h'},
{"version", no_argument, NULL, 'V'},
{"testloop", no_argument, NULL, 'T'},
{0, no_argument, NULL, 0}
};
char *opts = "dsul:UhV";
int
getlocale (LCID lcid, bool utf, bool test)
{
UINT codepage;
char iso639[10];
char iso3166[10];
if (!GetLocaleInfo (lcid, LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER,
(char *) &codepage, sizeof codepage)
|| !GetLocaleInfo (lcid, LOCALE_SISO639LANGNAME, iso639, 10)
|| !GetLocaleInfo (lcid, LOCALE_SISO3166CTRYNAME, iso3166, 10))
{
if (!test)
fprintf (stderr, "%s: Non existant locale\n", __progname);
return 2;
}
if (utf)
codepage = 0;
if (test)
{
char cty[256];
char lang[256];
GetLocaleInfo (lcid, LOCALE_SENGCOUNTRY, cty, 256);
GetLocaleInfo (lcid, LOCALE_SENGLANGUAGE, lang, 256);
printf ("0x%04x=\"%s_%s\", %s (%s)\n", (unsigned) lcid, iso639, iso3166,
lang, cty);
}
else
printf ("LANG=\"%s_%s%s\"\n", iso639, iso3166, codepage ? "" : ".UTF-8");
return 0;
}
#define d(X) {X, #X}
struct dl {
LCTYPE t;
const char *s;
} dlist[] = {
d(LOCALE_SLONGDATE),
d(LOCALE_SSHORTDATE),
d(LOCALE_STIMEFORMAT),
d(LOCALE_SYEARMONTH),
d(LOCALE_S1159),
d(LOCALE_S2359),
d(LOCALE_SDAYNAME1),
d(LOCALE_SDAYNAME2),
d(LOCALE_SDAYNAME3),
d(LOCALE_SDAYNAME4),
d(LOCALE_SDAYNAME5),
d(LOCALE_SDAYNAME6),
d(LOCALE_SDAYNAME7),
d(LOCALE_SABBREVDAYNAME1),
d(LOCALE_SABBREVDAYNAME2),
d(LOCALE_SABBREVDAYNAME3),
d(LOCALE_SABBREVDAYNAME4),
d(LOCALE_SABBREVDAYNAME5),
d(LOCALE_SABBREVDAYNAME6),
d(LOCALE_SABBREVDAYNAME7),
d(LOCALE_SMONTHNAME1),
d(LOCALE_SMONTHNAME2),
d(LOCALE_SMONTHNAME3),
d(LOCALE_SMONTHNAME4),
d(LOCALE_SMONTHNAME5),
d(LOCALE_SMONTHNAME6),
d(LOCALE_SMONTHNAME7),
d(LOCALE_SMONTHNAME8),
d(LOCALE_SMONTHNAME9),
d(LOCALE_SMONTHNAME10),
d(LOCALE_SMONTHNAME11),
d(LOCALE_SMONTHNAME12),
d(LOCALE_SMONTHNAME13),
d(LOCALE_SABBREVMONTHNAME1),
d(LOCALE_SABBREVMONTHNAME2),
d(LOCALE_SABBREVMONTHNAME3),
d(LOCALE_SABBREVMONTHNAME4),
d(LOCALE_SABBREVMONTHNAME5),
d(LOCALE_SABBREVMONTHNAME6),
d(LOCALE_SABBREVMONTHNAME7),
d(LOCALE_SABBREVMONTHNAME8),
d(LOCALE_SABBREVMONTHNAME9),
d(LOCALE_SABBREVMONTHNAME10),
d(LOCALE_SABBREVMONTHNAME11),
d(LOCALE_SABBREVMONTHNAME12),
d(LOCALE_SABBREVMONTHNAME13),
{ 0, NULL }
};
int main (int argc, char **argv)
{
int opt;
LCID lcid = LOCALE_SYSTEM_DEFAULT;
bool utf = false;
bool test = false;
bool dates = false;
while ((opt = getopt_long (argc, argv, opts, longopts, NULL)) != EOF)
switch (opt)
{
case 's':
lcid = LOCALE_SYSTEM_DEFAULT;
break;
case 'u':
lcid = LOCALE_USER_DEFAULT;
break;
case 'l':
lcid = strtoul (optarg, NULL, 0);
break;
case 'U':
utf = true;
break;
case 'h':
usage (stdout, 0);
break;
case 'V':
version ();
break;
case 'T':
test = true;
break;
case 'd':
dates = true;
break;
default:
usage (stderr, 1);
break;
}
if (test)
{
for (unsigned lang = 1; lang <= 0x3ff; ++lang)
for (unsigned sublang = 1; sublang <= 0x3f; ++sublang)
getlocale ((sublang << 10) | lang, false, true);
return 0;
}
if (dates)
{
char buf[256];
for (dl *dp = dlist; dp->t; ++dp)
if (GetLocaleInfo (lcid, dp->t, buf, 256))
printf ("%s: <%s>\n", dp->s, buf);
return 0;
}
return getlocale (lcid, utf, false);
}
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://x.cygwin.com/docs/
FAQ: http://x.cygwin.com/docs/faq/