【问题标题】:Python: extract Cyrillic string from EXIFPython:从 EXIF 中提取西里尔文字符串
【发布时间】:2012-07-19 18:20:57
【问题描述】:

我是 Python 的一个完整的初学者,并且想开始学习它。也就是说,我很想更正我拥有的一大堆家庭照片中的一些 EXIF 信息。首先,我想正确地从 JPEG 文件中获取这些信息。

其中一些有一个用 EXIF 写的标题。它可以得到例如由

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

到目前为止,我已经做到了。现在问题来了。一些标题包含西里尔字母。如果我这样做 print title.human_value 我会得到例如

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

print title

<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。蒂亚!

【问题讨论】:

  • 让我们弄清楚我们的数据到底是什么。 type( title.human_value )[ord(x) for x in title.human_value] 得到什么?
  • @RussellBorogove:&lt;type 'str'&gt;[208, 156, 208, 184, 208, 187, 208, 190, 208, 185, 32, 208, 156, 208, 176, 208, 188, 209, 131, 208, 187, 208, 181, 32, 208, 190, 209, 130, 32, 208, 156, 208, 176, 208, 185, 208, 184, 44, 32, 49, 49, 32, 209, 143, 208, 189, 208, 178, 208, 176, 209, 128, 209, 143, 32, 49, 57, 52, 52, 46]

标签: python string unicode encoding exif


【解决方案1】:

字节为 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 3 中运行吗?我有 2.7.2,我得到 Traceback (most recent call last): File "&lt;stdin&gt;", line 1, in &lt;module&gt; File "C:\Python27\lib\encodings\utf_16.py", line 16, in decode return codecs.utf_16_decode(input, errors, True) UnicodeDecodeError: 'utf16' codec can't decode byte 0x5d in position 264: truncated data
  • 添加的解决方案在显示代码方面效果很好。然而,最初的问题是:是否有可能看到俄罗斯字母。 Python 2 根本不可能吗?我已准备好切换到 Python 3,但是我的发行版 Python(xy) 与 Python 2 一起使用,我想稍后使用 python-to-exe 转换器。所以我现在坚持使用 Python 2。
  • 我在 IDLE 中做了 Python 3 示例,但在 Python 控制台中做了 Python 2 示例。如果我在 IDLE 中执行 Python 2 示例并打印结果,我会得到 Милой Мамуле от Майи, 11 января 1944.
  • 经过几天的搜索,我相信应该以某种方式将 IDLE 设置为进行 Unicode 输出。但是我没有做到这一点。我的 IDLE 编码是“cp1252”,Spyder 编码是“无”。我尝试创建 Windows 环境变量 PYTHONIOENCODING=utf-8,但它并没有改变任何东西。你用的是 Mac,默认的编码大概是一些 Unicode。
  • 我在 Windows XP Pro(32 位)上使用了 IDLE。
【解决方案2】:

我认为 title.human_value 数据采用 UTF-8 格式,已经从标题的原始 UTF-16 字节解码。

在 python shell 中,在 OSX 的终端窗口中运行:

>>> # this should be the same as your title.human_value:
>>> print ''.join( chr(x) for x in [208, 156, 208, 184, 208, 
              187, 208, 190, 208, 185, 32, 208, 156, 208, 
              176, 208, 188, 209, 131, 208, 187, 208, 181, 
              32, 208, 190, 209, 130, 32, 208, 156, 208, 
              176, 208, 185, 208, 184, 44, 32, 49, 49, 32, 
              209, 143, 208, 189, 208, 178, 208, 176, 209, 
              128, 209, 143, 32, 49, 57, 52, 52, 46])

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

您的控制台可能不支持西里尔字符。您可以尝试将命令提示符中的字体设置为“Lucida Console”——与 cmd 默认使用的历史位图字体相比,更现代的矢量字体更有可能正确支持它。

【讨论】:

  • 没有帮助。使用print u'привет',我得到??????。您的代码一开始就显示 Милой Мамуле от Майи, 11 ÑÐ½Ð²Ð°Ñ€Ñ 1944. 是我的。 MRAB 的解决方案解决了这个问题,但我仍然没有得到俄语符号。
  • 我不认为这是 Python 2 问题(我使用的是 Python 2.6),我认为这是终端编码问题。在 python 提示符下,尝试import sys; print sys.stdout.encoding
  • 尝试将其设置为 'utf-8' 并再次打印您的字符串?我不确定我的系统编码是如何设置的...
  • 我感到自己很无助。我不知道如何设置它。此外,帮助页面中提到的一些函数(例如 sys.getdefaultencoding)没有出现在我的 Python 中!可能,我应该先获得一些 Python 经验,然后再回到这个问题。与此同时,我正在使用一种解决方法:使用 PyQt 显示 Unicode 字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多