--- ./libkexiv2/libkexiv2/kexiv2.cpp.orig 2007-09-08 02:21:16.000000000 +0300 +++ ./libkexiv2/libkexiv2/kexiv2.cpp 2008-02-05 22:51:48.000000000 +0200 @@ -48,6 +48,9 @@ #include #include #include +#include +#include +#include // Exiv2 includes. @@ -86,7 +89,7 @@ { public: - KExiv2Priv(){} + KExiv2Priv(); QString filePath; @@ -95,8 +98,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; @@ -1168,7 +1187,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", " "); @@ -1214,7 +1235,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", " "); @@ -1238,7 +1261,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 ) @@ -1609,7 +1633,9 @@ // Decode the tag value with a user friendly output. std::ostringstream os; os << *md; - QString value = QString::fromAscii(os.str().c_str()); + QString value; + if (d->iptcEncodingCodec) value = d->iptcEncodingCodec->toUnicode(os.str().c_str()); + else value = QString::fromAscii(os.str().c_str()); // To make a string just on one line. value.replace("\n", " ");