2012-03-19 3 views
1

Мое приложение позволяет пользователям загружать изображение с помощью «встроенных» титров. Эти заголовки взяты из данных exif:символы появляются с вопросительными знаками, когда внутри атрибутов тегов html

foreach (exif_read_data('image.jpg', 0, true) as $key => $section) { 
    foreach ($section as $name => $val) { 
     if ($key == 'IFD0' && $name == 'Title') { 
      $caption = $val; 
      break; 
     } 
    } 
    if ($caption !== '') { break; } 
} 
//save $caption to database 

Изображения отображаются вместе с их заголовками. Заголовок каждого изображения визуализируется 2 раза:

  1. title атрибут <a>, который обернут вокруг изображения
  2. в div, который содержит заголовок

Это результат:

<a title="T?h?i?s? ?i?s? ?a? ?c?a?p?t?i?o?n?" href="#"><img src="image.jpg"></a> 
<div class="caption">This is a caption.</div> 

Как вы можете видеть, когда подпись находится внутри атрибута title, приложение для вопросительных знаков уха. Почему это так?

Я хотел бы отметить, что я создал приложение для работы с utf8 (база данных, html-страницы). Я также попытался извлечь utf8_encode() извлеченную подпись перед ее сохранением в базу данных, но безрезультатно.

Любые идеи?

EDIT: Кстати, причина для использования в <a> так, что изображение появляется в лайтбокс JQuery при нажатии.

EDIT: @tpaksu, вот фактический сброс результата exif_read_data('image.jpg', 0, true)

Array 
(
    [FILE] => Array 
     (
      [FileName] => 174.jpg 
      [FileDateTime] => 1332196128 
      [FileSize] => 236179 
      [FileType] => 2 
      [MimeType] => image/jpeg 
      [SectionsFound] => ANY_TAG, IFD0, EXIF, GPS, WINXP 
     ) 

    [COMPUTED] => Array 
     (
      [html] => width="640" height="427" 
      [Height] => 427 
      [Width] => 640 
      [IsColor] => 1 
      [ByteOrderMotorola] => 1 
      [CCDWidth] => 9mm 
      [ApertureFNumber] => f/11.0 
      [UserComment] => 
      [UserCommentEncoding] => UNDEFINED 
     ) 

    [IFD0] => Array 
     (
      [ImageDescription] => STATE OF CALAMITY/FEB. 2, 2012: Firemen and residents of sitio San Roque in Talisay City help each other in putting off the fire. The Talisay City council wants to declare sitio Laray in a state of calamity.(CDN PHOTO/JUNJIE MENDOZA) 
      [Make] => Canon 
      [Model] => Canon EOS 50D 
      [Orientation] => 1 
      [Software] => Adobe Photoshop CS2 Windows 
      [DateTime] => 2012:02:04 18:54:15 
      [YCbCrPositioning] => 1 
      [UndefinedTag:0x1001] => 4752 
      [UndefinedTag:0x1002] => 3168 
      [Exif_IFD_Pointer] => 2544 
      [GPS_IFD_Pointer] => 5304 
      [Title] => S�T�A�T�E� �O�F� �C�A�L�A�M�I�T�Y�/�F�E�B�.� �2�,� �2�0�1�2�:� �F�i�r�e�m�e�n� �a�n�d� �r�e�s�i�d�e�n�t�s� �o�f� �s�i�t�i�o� �S�a�n� �R�o�q�u�e� �i�n� �T�a�l�i�s�a�y� �C�i�t�y� �h�e�l�p� �e�a�c�h� �o�t�h�e�r� �i�n� �p�u�t�t�i�n�g� �o�f�f� �t�h�e� �f�i�r�e�.� �T�h�e� �T�a�l�i�s�a�y� �C�i�t�y� �c�o�u�n�c�i�l� �w�a�n�t�s� �t�o� �d�e�c�l�a�r�e� �s�i�t�i�o� �L�a�r�a�y� �i�n� �a� �s�t�a�t�e� �o�f� �c�a�l�a�m�i�t�y�.�(�C�D�N� �P�H�O�T�O�/�J�U�N�J�I�E� �M�E�N�D�O�Z�A�)��� 
      [Subject] => S�T�A�T�E� �O�F� �C�A�L�A�M�I�T�Y�/�F�E�B�.� �2�,� �2�0�1�2�:� �F�i�r�e�m�e�n� �a�n�d� �r�e�s�i�d�e�n�t�s� �o�f� �s�i�t�i�o� �S�a�n� �R�o�q�u�e� �i�n� �T�a�l�i�s�a�y� �C�i�t�y� �h�e�l�p� �e�a�c�h� �o�t�h�e�r� �i�n� �p�u�t�t�i�n�g� �o�f�f� �t�h�e� �f�i�r�e�.� �T�h�e� �T�a�l�i�s�a�y� �C�i�t�y� �c�o�u�n�c�i�l� �w�a�n�t�s� �t�o� �d�e�c�l�a�r�e� �s�i�t�i�o� �L�a�r�a�y� �i�n� �a� �s�t�a�t�e� �o�f� �c�a�l�a�m�i�t�y�.�(�C�D�N� �P�H�O�T�O�/�J�U�N�J�I�E� �M�E�N�D�O�Z�A�)��� 
      [UndefinedTag:0xEA1C] => ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� 
     ) 

    [EXIF] => Array 
     (
      [ExposureTime] => 1/125 
      [FNumber] => 11/1 
      [ISOSpeedRatings] => 400 
      [ExifVersion] => 0221 
      [DateTimeOriginal] => 2012:02:02 12:40:00 
      [DateTimeDigitized] => 2012:02:02 12:40:00 
      [ComponentsConfiguration] => � 
      [ShutterSpeedValue] => 458752/65536 
      [ApertureValue] => 458752/65536 
      [ExposureBiasValue] => 0/1 
      [Flash] => 16 
      [FocalLength] => 16/1 
      [UserComment] => ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ 
      [SubSecTimeOriginal] => 00 
      [SubSecTimeDigitized] => 00 
      [FlashPixVersion] => 0100 
      [ColorSpace] => 1 
      [ExifImageWidth] => 2000 
      [ExifImageLength] => 1333 
      [FocalPlaneXResolution] => 4752000/894 
      [FocalPlaneYResolution] => 3168000/597 
      [FocalPlaneResolutionUnit] => 2 
      [CustomRendered] => 0 
      [ExposureMode] => 1 
      [WhiteBalance] => 0 
      [SceneCaptureType] => 0 
      [UndefinedTag:0xEA1C] => ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� 
     ) 

    [GPS] => Array 
     (
      [GPSVersion] => �� 
     ) 

    [WINXP] => Array 
     (
      [Title] => STATE OF CALAMITY/FEB. 2, 2012: Firemen and residents of sitio San Roque in Talisay City help each other in putting off the fire. The Talisay City council wants to declare sitio Laray in a state of calamity.(CDN PHOTO/JUNJIE MENDOZA) 
      [Subject] => STATE OF CALAMITY/FEB. 2, 2012: Firemen and residents of sitio San Roque in Talisay City help each other in putting off the fire. The Talisay City council wants to declare sitio Laray in a state of calamity.(CDN PHOTO/JUNJIE MENDOZA) 
     ) 

) 
+1

Возможно, текст в формате utf-16? Но я не могу понять, почему он будет отображаться с '?' В одном месте, а не в другом, если ваш исходный источник в обоих случаях одинаковый. –

+0

Тексты устанавливаются с помощью «Информация о файле» в Photoshop – Obay

+0

Я не уверен, что данные EXIF ​​имеют предписанный набор символов для текста или зависит от приложения, чтобы определить кодировку при ее разборе. Вы пытались обнаружить набор символов, в котором находятся данные EXIF? http://php.net/manual/en/function.mb-detect-encoding.php – GordonM

ответ

3

Ok попробовать это в вашем коде.

if ($key == 'IFD0' && $name == 'Title') { 
    if(strpos($val,"�")>0){ 
     for($i=0;$i<len($val);$i++){ 
      $newval.=$val[i]; 
      $i++; 
     } 
    } 
    $caption = $val; 
    break; 
} 

или

if ($key == 'IFD0' && $name == 'Title') { 
    $caption = preg_replace('/[^(\x20-\x7F)]*/','', $val); 
    break; 
} 
+0

он отлично работает! Спасибо чувак! ;) – Obay

+0

второй более надежный, хотя. :) Пожалуйста. –

2

Windows 7 кажется кодировать IFD0 тегов с использованием UTF-16 Little Endian, так что вы можете также попробовать разборе этих значений Iconv() и облицовку() в Полученная строка только в случае:

$exif_data = exif_read_data($file, NULL, true, false); 
    if (isset($exif_data['IFD0'])) { 
     $title = trim(iconv('UTF-16LE','UTF-8',$ifd0['Title'])); 
    } 

я, конечно, t было бы разумно убедиться, что ваша система обеспечивает UTF-16LE и UTF-8

Смежные вопросы