2010-08-04 1039 views
8

我正在使用名爲EXIFextractor的庫從圖像中提取元數據信息。該lib部分使用System.Drawing.Imaging.PropertyItem來完成所有的辛苦工作。根據Microsoft文檔,PropertyItem中的一些數據(如圖像細節等)被作爲存儲在byte []中的ASCII字符串提取。C#:將byte []轉換爲UTF8編碼的字符串

我的問題是,國際字符(å,ä,ö等等)被刪除並替換爲問號。當我調試代碼時,顯然byte []是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); 
} 

這是我的代碼,我盡我所能處理t他的結果如上。

   try { 
    EXIFextractor exif = new EXIFextractor(ref bmp, ""); 
    object o; 
        if ((o = exif["Image Description"]) != null) 
         MediaFile.Description = Tools.UTF8Encode(o.ToString()); 

我也嘗試了幾個讓我珍貴的A,A,從數據O的其他方法,但似乎沒有這樣的伎倆。我開始認爲Hans Passant在他的回答中對他的結論是正確的。

+0

如果使用ASCII編碼讀取信息,則任何非ASCII字符都不會被正確讀取。用編碼讀取字符然後寫入字節數組聽起來不太合適。你能鏈接到說明這種情況的文檔嗎? – 2010-08-04 14:50:24

+1

這是,如果我被允許發佈另一個超鏈接:) http://msdn.microsoft.com/en-us/library/system.drawing.imaging.propertyitem.type.aspx – dotmartin 2010-08-05 09:30:17

回答

32
string yourText = System.Text.Encoding.UTF8.GetString(yourByteArray); 
+1

感謝您的迅速答覆。不過,我已經試過了。沒有運氣。我開始懷疑源代碼(圖像文件)是否正確編碼。 – dotmartin 2010-08-04 14:17:41

+0

如果您可以分享一個示例,我們可能會自行檢查或嘗試。 – Scoregraphic 2010-08-05 05:09:59

+1

當然。由於我是這方面的新手,我是否應該將其作爲答覆或評論提供,或者做這件事的首選方式是什麼? – dotmartin 2010-08-05 09:06:38

1

也許你可以嘗試另一種編碼? UTF16,Unicode? 如果您不確定它是否正確編碼,請嘗試使用另一個exif閱讀器查看exif元數據。

2

是的,這是發起圖像的應用程序或相機的問題。 EXIF標準對文本有着可怕的支持,它必須用ASCII編碼。只有當攝影師說英語時,這種方法纔會奏效。毫無疑問,編碼圖像的軟件忽略了這一要求。 PropertyItem類也是這樣做的,它使用Marshal.StringToHGlobalAnsi()將字符串編碼爲byte [],該字符串假定系統的默認代碼頁。

沒有明顯的解決方法,當照片離機器太遠時,你會得到mojibake。

+1

這就是我的預期。我仍然希望Photoshop和XMP內置的工具能夠讓事情變得簡單。 有什麼建議可以解決這個問題?我的公司有很多文件編碼不好,所以批處理器是首選。 – dotmartin 2010-08-05 06:23:06

+0

字節數組中的所有字節是否正確根據您的語言環境是否仍然正確?如果是這樣,您可以嘗試使用您的語言環境而不是UTF8/ascii進行編碼/解碼。請參閱http://msdn.microsoft.com/en-us/library/system.text.encoding.getencoding.aspx – Scoregraphic 2010-08-05 09:44:14

+0

沒有運氣。我仍然收到問號。 – dotmartin 2010-08-05 10:45:52