Re: iconv trouble
On 2009-05-29 19:59:50 +0100, Daniel Luis dos Santos
<daniel.dlds@gmail.com> said:
Hello,
I am trying to make a function that converts WCHAR_T strings to UTF-8.
After experimenting for a while, found out that I can only convert
standard ASCII chars. When I put a vowel with an accent (for example) I
always get a EILSEQ in errno. I am trying to convert using the
following test function :
void convTest() {
wchar_t *str = L"a ?tring";
char *inBuf = (char*)str;
size_t inBufSize = sizeof(wchar_t)*wcslen(str);
char *outBuf = (char*)malloc(1024);
size_t outBufAvailSize = sizeof(char)*1024;
iconv_t ds = iconv_open("UTF-8", "WCHAR_T");
size_t converted = iconv(ds, &inBuf, &inBufSize, &outBuf, &outBufAvailSize);
if (converted == (size_t)-1)
if (errno == EILSEQ)
printf("invalid char sequence");
else if (errno == EINVAL)
printf("incomplete input");
else if (errno == E2BIG)
printf("not enough space");
}
The ? character causes an EILSEQ. I am in portugal with a portuguese keyboard.
Help !
Ok,
I noticed in a terminal window that the locale was C, and from the
glibc docs learned that at startup the current locale of any C program
is also C.
I then called
<code>setlocale(LC_ALL, "pt_PT.UTF-8");</code>
before calling the function in the previous post and the iconv call succeeded.
But now I am confused. Isn't UTF-8 locale independent ? I was supposing
that UTF-8 contained every possible character and that a conversion
existed between it and wchar_t.
What if in my program I want decode characters from different locales
than the one on my machine ? From what I've learned from the glibc
docs, the call to setlocale sets the locale machine-wide, so that is
not an option as it would mess up other programs, right ?
How do you deal with this when a single program must handle multiple locales ?