This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
is the concept of codecvt_t::partial broken ?
- From: Oncaphillis <oncaphillis at snafu dot de>
- To: libstdc++ at gcc dot gnu dot org
- Date: Wed, 26 Sep 2012 12:18:32 +0200
- Subject: is the concept of codecvt_t::partial broken ?
Hi,
I'm writing yet another char encoding translator with the help of codecvt< >
and stumbled across the following problem. When I try to interprese a
byte sequence
as ShiftJis I never get the result code codcvt_t::partial even if I feed
a single
0xe0 as the only input which the iconv should interprete as an
incomplete two byte
sequence. The same seems to hold true with other multi char encodings as
well
Here's my code: "PARTIAL" never gets printed:
<snip>
bool ToWString(const std::string & str,std::wstring & ws,const
std::string & rEnc="ja_JP.sjis")
{
typedef std::codecvt< wchar_t, char, std::mbstate_t >
codecvt_t;
std::locale loc(rEnc.c_str());
const codecvt_t & fc = std::use_facet<codecvt_t>( loc );
ws.clear();
codecvt_t::result r=codecvt_t::ok;
std::mbstate_t st=mbstate_t();
const char *ca = str.c_str();
const char *co = ca+str.length();
const char *cn = ca;
for(int i=0;i<str.length();i++)
{
std::cerr << "0x" << std::hex << (int)str[i] <<
std::dec << " ";
}
std::cerr << std::endl;
while(co!=cn)
{
static const int l = 10;
static wchar_t wo[l];
wchar_t *wn=NULL;
if( (r=fc.in(st,ca,ca+1,cn,wo,wo+l,wn))==codecvt_t::error)
{
break;
}
if(r==codecvt_t::partial)
{
std::cerr << "PARTIAL" << std::endl;
}
ws+=std::wstring(wo,wn-wo);
ca=cn;
}
return (r==codecvt_t::ok || r==codecvt_t::noconv);
}
<snip>