C #: преобразование байта [] в строку в кодировке UTF8 - PullRequest
9 голосов
/ 04 августа 2010

Я использую библиотеку EXIFextractor для извлечения метаданных из изображений.Эта библиотека частично использует System.Drawing.Imaging.PropertyItem для выполнения всей тяжелой работы.Некоторые данные в PropertyItem, такие как Image Details и т. Д., Извлекаются в виде ASCII-строки, хранящейся в байте [] в соответствии с документацией Microsoft.

Моя проблема в том, что международные символы (å, ä, ö, и так далее) отбрасываются и заменяются вопросительными знаками.Когда я отлаживаю код, становится очевидным, что byte [] является представлением UTF-8.

Я бы хотел проанализировать байт [] как строку UTF8, как я могу это сделать, не теряя при этом никакой информации?

Заранее спасибо!


Обновление:

Меня попросили предоставить фрагмент из моего кода:

Первый фрагмент из класса, который я использую, а именно EXIFextractor.cs , написанный Асимом Гоером

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()); 

Я также попробовал несколько других способов получить мои драгоценные å, ä, ö из данных, но, похоже, ничего не помогло.Я начинаю думать, что Ханс Пассант прав в своих выводах в своем ответе ниже.

Ответы [ 4 ]

37 голосов
/ 04 августа 2010
string yourText = System.Text.Encoding.UTF8.GetString(yourByteArray);
4 голосов
/ 04 августа 2010

Используйте метод GetString для объекта Encoding.UTF8.

2 голосов
/ 04 августа 2010

Да, это проблема с приложением или камерой, которая создала изображение. Стандарт EXIF ​​имеет ужасную поддержку текста, он должен быть закодирован в ASCII. Это хорошо работает только тогда, когда фотограф говорит по-английски. Без сомнения, программное обеспечение, которое закодировало изображение, игнорирует это требование. Именно это и делает класс PropertyItem: он кодирует строку в byte [] с помощью Marshal.StringToHGlobalAnsi (), которая принимает кодовую страницу системы по умолчанию.

Нет очевидного решения этой проблемы, вы получите mojibake, когда фотография была сделана слишком далеко от вашей машины.

1 голос
/ 04 августа 2010

Может быть, вы могли бы попробовать другую кодировку? UTF16, Юникод? Если вы не уверены в правильности кодирования, попробуйте просмотреть метаданные exif с помощью другого exif-ридера.

...