std::codecvt::out() returns a no-op in marginal situations
Martin Sebor
sebor@roguewave.com
Mon Jan 21 15:59:00 GMT 2008
Sam Varshavchik wrote:
[...]
> Anyone know if there exists
> some encoding where a multibyte sequence produces more than one
> wchar_t?
Assuming by multibyte sequence you mean a sequence that forms
a single character (plus any shift sequences) I believe the only
such encoding is UTF-16. Other than that, I haven't encountered
such an encoding on any of the systems we deal with (most modern
Unices).
Martin
> I want to see what happens when you feed it to inp(), but give
> it a one element wchar_t outbuf buffer. Reading iconv(3) closely:
>
> 4. The output buffer has no more room for the next converted
> character.
> In this case it sets errno to E2BIG and returns (size_t)(-1).
>
> A brief experiment:
>
> iconv_t i=iconv_open("UTF-8", "WCHAR_T");
> wchar_t iarr[]={0x00e8,0x00e8};
> char carr[3];
>
> char *inbuf=(char *)&iarr[0];
> char *outbuf=carr;
>
> size_t inbytesleft=sizeof(iarr);
> size_t outbytesleft=sizeof(carr);
>
> size_t n=iconv(i, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
>
> printf("Return code %d, errno=%s\n", (int)n, strerror(errno));
> printf("inbytesleft=%d, outbytesleft=%d\n",
> (int)inbytesleft, (int)outbytesleft);
>
> Result:
>
> Return code -1, errno=Argument list too long
> inbytesleft=4, outbytesleft=1
>
> iconv() converted the first wchar_t, but then stopped and terminated
> with room in both input and outbuf buffers. Since iconv(), via mbr..(),
> is presumably used for inp() as well, I should expect the same behavior
> for encodings where multibyte sequences can produce more than one
> wchar_t, if such encoding exists. I'm wondering if the current logic in
> basic_filebuf handles this situation -- haven't yet deciphered it.
>
>
>
More information about the Libstdc++
mailing list