gcc4[1.7] printf treats differently a string constant and a character array

Andy Koppe andy.koppe@gmail.com
Tue Dec 29 11:21:00 GMT 2009


2009/12/29 Rodrigo Medina:
>>Ah, the problem actually is that your program is missing a call to
>>setlocale(LC_CTYPE, "") to switch to the locale and character set
>>specified in the environment...
>
> That worked!, but what that means is that if one wants to
> use any locale other than C.UTF-8, one has, not only to compile again the
> programs , but also to modify them. Perhaps the best thing to do
> is to read the LC_ALL variable from the environment and then call
> setlocale.

setlocale(LC_CTYPE, "") already does that. It tries to read LC_ALL,
LC_CTYPE, and LANG, in that order, and only if none of them are set it
falls back to the default locale: C.UTF-8.

'char' string constants with non-ASCII characters are not a good idea
if the program is supposed to work with different charsets, because
they're encoded in one particular charset, namely that of your editor.

In that case you need to use wchar_t strings instead, for example:

#include <locale.h>
#include <wchar.h>

int main(void) {
  setlocale(LC_CTYPE, "");
  wprintf(L"Øl\n");
}

You also need to ensure that gcc's character set matches the source
file's; otherwise gcc won't encode the wide string correctly.

Andy

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple



More information about the Cygwin mailing list