Я пользуюсь библиотекой под названием EXIFextractor для извлечения информации о метаданных из изображений. Этот lib частично использует Систему. Рисование. Обработка изображений. PropertyItem, чтобы сделать всю тяжелую работу. Некоторые данные в PropertyItem, такие как Детали Изображения и так далее, выбираются как строка ASCII, сохраненная в байте [] согласно документации Microsoft.
Моя проблема состоит в том, что международные символы (å, ä, ö, и так далее) отбрасываются и заменяются вопросительными знаками. Когда я отлаживаю код, очевидно, что байт [] является представлением UTF-8.
Я хотел бы проанализировать байт [] как UTF8-строка, как я могу сделать это, не освобождая информации в процессе?
Заранее спасибо!
Обновление:
Меня попросили обеспечить отрывок из моего кода:
Первый отрывок от класса, который я использую, а именно, EXIFextractor.cs, записанный Asim Goheer
foreach( System.Drawing.Imaging.PropertyItem p in parr )
{
string v = "";
// ...
else if( p.Type == 0x2 )
{
// string
v = ascii.GetString(p.Value);
}
И это - мой код, где я стараюсь изо всех сил обрабатывать результаты вышеупомянутого.
try {
EXIFextractor exif = new EXIFextractor(ref bmp, "");
object o;
if ((o = exif["Image Description"]) != null)
MediaFile.Description = Tools.UTF8Encode(o.ToString());
Я также попробовал несколько других способов получить мой драгоценный å, ä, ö от данных, но ничто, кажется, не добивается цели. Я начинаю думать, что Hans Passant прав относительно своих заключений в его ответе ниже.
string yourText = System.Text.Encoding.UTF8.GetString(yourByteArray);
Используйте метод GetString
для объекта Encoding.UTF8
.
Может, попробуете другую кодировку? UTF16, Unicode? Если вы не уверены, правильно ли он кодирует, попробуйте сначала просмотреть метаданные exif с помощью другого считывателя exif.
Да, это проблема приложения или камеры, которая создала изображение. Стандарт EXIF ужасно поддерживает текст, его приходится кодировать в ASCII. Это хорошо работает только тогда, когда фотограф говорит по-английски. Несомненно, программное обеспечение, закодировавшее изображение, игнорирует это требование. Именно это делает и класс PropertyItem, он кодирует строку в byte[] с помощью Marshal.StringToHGlobalAnsi(), которая предполагает кодовую страницу системы по умолчанию.
Очевидного исправления этого нет, вы получите mojibake, если фотография была сделана слишком далеко от вашей машины.