--- libkexiv2/kexiv2.cpp (revision 632990) +++ libkexiv2/kexiv2.cpp (working copy) @@ -47,6 +47,9 @@ #include #include #include +#include +#include +#include // Exiv2 includes. @@ -68,7 +71,7 @@ { public: - KExiv2Priv(){} + KExiv2Priv(); QString filePath; @@ -77,8 +80,24 @@ Exiv2::ExifData exifMetadata; Exiv2::IptcData iptcMetadata; + + QTextCodec *iptcEncodingCodec; }; +KExiv2Priv::KExiv2Priv() +{ + iptcEncodingCodec = NULL; + if (KGlobal::instance()) + { + KConfig *config = KGlobal::config(); + config->setGroup("Metadata Settings"); + QString iptcEncoding = config->readEntry("IPTC Encoding"); + + if (!iptcEncoding.isEmpty() && iptcEncoding != "ASCII") + iptcEncodingCodec = KGlobal::charsets()->codecForName(KGlobal::charsets()->encodingForName(iptcEncoding)); + } +} + KExiv2::KExiv2() { d = new KExiv2Priv; @@ -1155,7 +1174,9 @@ { std::ostringstream os; os << *it; - QString tagValue = QString::fromLocal8Bit(os.str().c_str()); + QString tagValue; + if (d->iptcEncodingCodec) tagValue = d->iptcEncodingCodec->toUnicode(os.str().c_str()); + else tagValue = QString::fromLocal8Bit(os.str().c_str()); if (escapeCR) tagValue.replace("\n", " "); @@ -1179,7 +1200,8 @@ try { - d->iptcMetadata[iptcTagName] = value.ascii(); + if (d->iptcEncodingCodec) d->iptcMetadata[iptcTagName] = std::string(d->iptcEncodingCodec->fromUnicode(value)); + else d->iptcMetadata[iptcTagName] = value.ascii(); return true; } catch( Exiv2::Error &e )