如何正确使用Python库IPTCInfo写入utf8 IPTC元数据?

2 投票
1 回答
2690 浏览
提问于 2025-04-17 16:37

在用 PIL 生成 JPEG 缩略图文件后,我想使用 IPTCInfo 来写入包含法语带重音字符的 IPTC 元数据。我在考虑使用 UTF8 字符编码。

于是我尝试了以下方法:

info = IPTCInfo(input_file, force=True, inp_charset='utf8')
info.data['credit'] = some_unicode_string
info.saveAs(output_file)

还有很多其他的变化:

info = IPTCInfo(input_file, force=True)
info = IPTCInfo(input_file, force=True, inp_charset='utf8')
info = IPTCInfo(input_file, force=True, inp_charset='utf_8')
info = IPTCInfo(input_file, force=True, inp_charset='utf8', out_charset='utf8')
info = IPTCInfo(input_file, force=True, inp_charset='utf_8', out_charset='utf_8')
...

在用 IPTCInfo 读取元数据时,IPTCInfo 写入的元数据保留了 unicode 的 Python 字符串,但当我用其他软件读取时,比如 OSX 文件信息、Exiftools、PhotoShop、ViewNX2,总是会发现一些奇怪的字符。那么,使用 IPTCInfo 正确写入 unicode 的方法是什么,才能生成一个所有软件都能理解的标准合规文件呢?

1 个回答

0

关于你提问的内容,这里有一些相关的信息,来自IPTC论坛

  • 使用XMP包会简单很多:默认的字符集是UTF-8。因此,你可以使用甚至混合不同的字符集和书写系统。
  • IPTC IIM头部就有点复杂了:它包含一个字段,用来指示文本字段使用了哪种字符集(对于IIM专家来说,这是数据集1:90),但不幸的是,大多数图像软件并没有使用这个字段,只有在最近几年,一些软件才开始使用它。

IPTC EnvelopeRecord标签中,你会发现:

90 CodedCharacterSet string[0,32]!

(值的输入格式是“ESC X Y[, ...]”。UTF-8字符编码的转义序列是“ESC % G”,但为了方便显示,这里用“UTF8”。写入时可以使用任意字符串。这个标签的值会影响到应用程序和新闻照片记录中字符串值的解码。这个标签被标记为“不安全”,以防止在群组操作中默认复制,因为目标图像中现有的标签可能使用不同的编码。当从头创建新的IPTC记录时,如果有特殊字符的可能,建议将其设置为“UTF8”)

另外,查看-charset CHARSET

某些元信息格式允许使用除了普通ASCII以外的编码字符集。在读取时,大多数已知编码会根据exiftool的“-charset CHARSET”或-L选项转换为外部字符集,或者默认转换为UTF-8。在写入时,会进行反向转换。或者,特殊字符可以通过-E选项与HTML字符实体进行转换。

虽然IPTCInfo代码中的注释并不是很鼓舞人心,但代码中仍然有一个编码字典,提供了更多线索。

在你的代码示例中,看起来是正确的,你是这样写的。:)

info.data['credit'] = some_unicode_string

你把some_unicode_string称作什么?你确定它是一个utf-8字符串(!= unicode)吗?

撰写回答