# # # patch "charset.cc" # from [a6ebd9c06f8523d69e6c754319368cd98aafa55e] # to [cb4c4d6eb72633937e1a4769fdaac437a933e58f] # ============================================================ --- charset.cc a6ebd9c06f8523d69e6c754319368cd98aafa55e +++ charset.cc cb4c4d6eb72633937e1a4769fdaac437a933e58f @@ -49,21 +49,31 @@ charset_convert(string const & src_chars dst = src; else { - string tmp_charset(dst_charset); + // Always try converting without special treatment first. + char const * converted = stringprep_convert(src.c_str(), + dst_charset.c_str(), + src_charset.c_str()); -#ifdef ICONV_TRANSLIT - if (best_effort) - tmp_charset += "//TRANSLIT"; -#endif + if (best_effort && !converted) + { + // Not all iconv implementations support this. + string tmp_charset(dst_charset); + tmp_charset += "//TRANSLIT"; + converted = stringprep_convert(src.c_str(), + tmp_charset.c_str(), + src_charset.c_str()); - char * converted = stringprep_convert(src.c_str(), - tmp_charset.c_str(), - src_charset.c_str()); + // If that didn't work just give up. + if (!converted) + converted = src.c_str(); + } + E(converted != NULL, whence, F("failed to convert string from %s to %s: '%s'") - % src_charset % tmp_charset % src); + % src_charset % dst_charset % src); dst = string(converted); - free(converted); + if (converted != src.c_str()) + free(const_cast(converted)); } }