string const encoding = runparams.encoding->iconvName();
LYXERR(Debug::LATEX, "makeLaTeXFile encoding: " << encoding << "...");
- odocfstream ofs(encoding);
+ odocfstream ofs;
+ try { ofs.reset(encoding); }
+ catch (iconv_codecvt_facet_exception & e) {
+ lyxerr << "Caught iconv exception: " << e.what() << endl;
+ Alert::error(_("Iconv software exception Detected"), bformat(_("Please "
+ "verify that the support software for your encoding (%1$s) is "
+ "properly installed"), from_ascii(encoding)));
+ return false;
+ }
if (!openFileWrite(ofs, fname))
return false;
void writePlaintextFile(Buffer const & buf, FileName const & fname,
OutputParams const & runparams)
{
- odocfstream ofs;
+ odocfstream ofs("UTF-8");
if (!openFileWrite(ofs, fname))
return;
writePlaintextFile(buf, ofs, runparams);
namespace lyx {
+template<class Ios>
+void setEncoding(Ios & ios, string const & encoding, std::ios_base::openmode mode)
+{
+ // We must imbue the stream before openening the file
+ std::locale global;
+ std::locale locale(global, new iconv_codecvt_facet(encoding, mode));
+ ios.imbue(locale);
+}
+
const char * iconv_codecvt_facet_exception::what() const throw()
{
idocfstream::idocfstream(string const & encoding) : base()
{
- std::locale global;
- std::locale locale(global, new iconv_codecvt_facet(encoding, in));
- imbue(locale);
+ setEncoding(*this, encoding, in);
}
string const & encoding)
: base()
{
- // We must imbue the stream before openening the file
- std::locale global;
- std::locale locale(global, new iconv_codecvt_facet(encoding, in));
- imbue(locale);
+ setEncoding(*this, encoding, in);
open(s, mode);
}
+odocfstream::odocfstream(): base()
+{
+}
+
+
odocfstream::odocfstream(string const & encoding) : base()
{
- std::locale global;
- std::locale locale(global, new iconv_codecvt_facet(encoding, out));
- imbue(locale);
+ setEncoding(*this, encoding, out);
}
string const & encoding)
: base()
{
- // We must imbue the stream before openening the file
- std::locale global;
- std::locale locale(global, new iconv_codecvt_facet(encoding, out));
- imbue(locale);
+ setEncoding(*this, encoding, out);
open(s, mode);
}
+void odocfstream::reset(string const & encoding)
+{
+ setEncoding(*this, encoding, out);
+}
+
+
+
SetEnc setEncoding(string const & encoding)
{
return SetEnc(encoding);
class odocfstream : public std::basic_ofstream<char_type> {
typedef std::basic_ofstream<char_type> base;
public:
- odocfstream(std::string const & encoding = "UTF-8");
+ odocfstream();
+ odocfstream(std::string const & encoding);
explicit odocfstream(const char* s,
std::ios_base::openmode mode = std::ios_base::out|std::ios_base::trunc,
std::string const & encoding = "UTF-8");
~odocfstream() {}
+ ///
+ void reset(std::string const & encoding);
};
/// UCS4 input stringstream