bool Codec::detect(const string &str) const
{
- Decoder *dec = create_decoder();
+ Decoder *dec = create_decoder(IGNORE_ERRORS);
+
bool result = true;
- try
- {
- for(string::const_iterator i=str.begin(); i!=str.end(); )
- dec->decode_char(str, i);
- }
- catch(const CodecError &)
- {
- result = false;
- }
+ for(string::const_iterator i=str.begin(); (result && i!=str.end()); )
+ result = (dec->decode_char(str, i)!=-1);
delete dec;
return buf;
}
-void Codec::Encoder::error(unichar ch, string &buf, const string &msg)
-{
- switch(err_mode)
- {
- case TRANSLITERATE:
- transliterate(ch, buf);
- case IGNORE_ERRORS:
- break;
- default:
- throw CodecError(msg);
- }
-}
void Codec::Decoder::decode(const string &str, ustring &buf)
return buf;
}
-unichar Codec::Decoder::error(const string &msg)
-{
- switch(err_mode)
- {
- case TRANSLITERATE:
- return 0xFFFD;
- case IGNORE_ERRORS:
- return -1;
- default:
- throw CodecError(msg);
- }
-}
-
Codec *create_codec(const string &n)
{
string name;
if(name=="jisx0208") return new JisX0208;
if(name=="utf8") return new Utf8;
if(name=="windows1252" || name=="cp1252") return new Windows1252;
- throw InvalidParameterValue("Unknown string codec");
+ throw invalid_argument("unknown string codec");
}
Codec *detect_codec(const string &str)