Python:从 EXIF 中提取西里尔字符串

标签 python string unicode encoding exif

我是 Python 的完全初学者,想边做边学。也就是说,我很想更正我拥有的一大堆家庭照片中的一些 EXIF 信息。首先,我只想正确地从 JPEG 文件中获取这些信息。

其中一些有一个用 EXIF 编写的标题。它可以从例如通过

import pyexiv2
metadata = pyexiv2.ImageMetadata(filename)
metadata.read()
title = metadata['Exif.Image.XPTitle'] 

到此为止。现在问题来了。一些标题包含西里尔字母。例如,如果我执行 print title.human_value

`Милой Мамуле от Майи, 11 ÑÐ½Ð²Ð°Ñ€Ñ 1944.`

当使用打印标题时,它是

<Exif.Image.XPTitle [Byte] = 28 4 56 4 59 4 62 4 57 4 32 0 28 4 48 4 60 4 67 4 59 4 53 4 32 0 62 4 66 4 32 0 28 4 48 4 57 4 56 4 44 0 32 0 49 0 49 0 32 0 79 4 61 4 50 4 48 4 64 4 79 4 32 0 49 0 57 0 52 0 52 0 46 0 0 0>

我希望看到的实际字符串是

Милой Мамуле от Майи, 11 января 1944.

这似乎是一个 unicode 问题,但在尝试了在这里和其他地方找到的十几种不同方法之后,我还是无法应付它。是否有可能在控制台中看到俄文字母?我在 Windows 7(英文)上使用 python(xy),所以我的 IDE 是 spyder2。只是默认安装,我在其中添加了 pyexiv2。 TIA!

最佳答案

字节是UTF-16。

在 Python 3 中:

>>> b = [28, 4, 56, 4, 59, 4, 62, 4, 57, 4, 32, 0, 28, 4, 48, 4, 60, 4, 67, 4, 59, 4, 53, 4, 32, 0, 62, 4, 66, 4, 32, 0, 28, 4, 48, 4, 57, 4, 56, 4, 44, 0, 32, 0, 49, 0, 49, 0, 32, 0, 79, 4, 61, 4, 50, 4, 48, 4, 64, 4, 79, 4, 32, 0, 49, 0, 57, 0, 52, 0, 52, 0, 46, 0, 0, 0]
>>> bytes(b).decode("utf-16")
'Милой Мамуле от Майи, 11 января 1944.\x00'

在 Python 2 中:

>>> b = [28, 4, 56, 4, 59, 4, 62, 4, 57, 4, 32, 0, 28, 4, 48, 4, 60, 4, 67, 4, 59, 4, 53, 4, 32, 0, 62, 4, 66, 4, 32, 0, 28, 4, 48, 4, 57, 4, 56, 4, 44, 0, 32, 0, 49, 0, 49, 0, 32, 0, 79, 4, 61, 4, 50, 4, 48, 4, 64, 4, 79, 4, 32, 0, 49, 0, 57, 0, 52, 0, 52, 0, 46, 0, 0, 0]
>>> "".join(chr(c) for c in b).decode("utf-16")
u'\u041c\u0438\u043b\u043e\u0439 \u041c\u0430\u043c\u0443\u043b\u0435 \u043e\u04
42 \u041c\u0430\u0439\u0438, 11 \u044f\u043d\u0432\u0430\u0440\u044f 1944.\x00'

关于Python:从 EXIF 中提取西里尔字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11566983/

相关文章:

python - PyQt4——添加文本编辑区动画示例

Python无法导入,ImportError : No module named

python - 如何检查 DF 的列表和记录之间是否存在匹配,并根据匹配的存在返回匹配的值

c - 如何提取除前两个字符以外的所有子字符串?

java - 如何减少从 Uniscribe ScriptItemize 返回的运行次数

python - 如何在python中控制子线程进程?

python - PERL 脚本的输出未使用 Python 加载到 MySQL

c++ - 为什么 cout 需要标题字符串?

python - 组合变音符号不使用 unicodedata.normalize (PYTHON) 规范化

c# - 如何完成对 UTF8 文件的随机读取