- static IconvProcessor processor(utf16_codeset, ucs4_codeset);
- return iconv_convert<unsigned short>(processor, s, ls);
+ static QThreadStorage<IconvProcessor *> processor;
+ if (!processor.hasLocalData())
+ processor.setLocalData(new IconvProcessor(utf16_codeset, ucs4_codeset));
+ return iconv_convert<unsigned short>(*processor.localData(), s, ls);
+}
+
+
+IconvProcessor & ucs4ToUtf8()
+{
+ static QThreadStorage<IconvProcessor *> processor;
+ if (!processor.hasLocalData())
+ processor.setLocalData(new IconvProcessor("UTF-8", ucs4_codeset));
+ return *processor.localData();
+}
+
+namespace {
+
+IconvProcessor & getProc(map<string, IconvProcessor> & processors,
+ string const & encoding, bool to)
+{
+ string const & fromcode = to ? ucs4_codeset : encoding;
+ string const & tocode = to ? encoding : ucs4_codeset;
+ map<string, IconvProcessor>::iterator const it = processors.find(encoding);
+ if (it == processors.end()) {
+ IconvProcessor p(fromcode, tocode);
+ return processors.insert(make_pair(encoding, move(p))).first->second;
+ } else
+ return it->second;