C#:将byte []转换为UTF8编码的字符串

时间:2010-08-04 13:50:17

标签: c# character-encoding exif

我使用名为EXIFextractor的库从图像中提取元数据信息。这个lib部分是使用 System.Drawing.Imaging.PropertyItem 来完成所有艰苦的工作。根据Microsoft文档,PropertyItem中的某些数据(如Image Details等)将作为存储在byte []中的ASCII字符串提取。

我的问题是国际字符(å,ä,ö等等)被删除并被问号取代。当我调试代码时,很明显byte []是UTF-8的表示。

我想将byte []解析为UTF8字符串,如何在不丢失过程中的任何信息的情况下执行此操作?

提前致谢!


更新

我被要求提供代码中的代码段:

第一个片段来自我使用的类,即Asim Goheer编写的 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()); 

我还尝试了其他几种从数据中获取宝贵的å,ä,ö的方法,但似乎没有什么可行的。我开始认为Hans Passant在下面的答案中对他的结论是正确的。

4 个答案:

答案 0 :(得分:35)

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

答案 1 :(得分:4)

GetString对象上使用Encoding.UTF8方法。

答案 2 :(得分:2)

是的,这是发起图像的应用或相机的问题。 EXIF标准对文本有很强的支持,它必须用ASCII编码。当摄影师说英语时,这种情况一直很好。毫无疑问,编码图像的软件忽略了这一要求。这也是PropertyItem类正在做的事情,它使用Marshal.StringToHGlobalAnsi()将字符串编码为byte [],该字符串假定系统的默认代码页。

对此没有明显的解决方法,当照片离你的机器太远时,你会得到mojibake。

答案 3 :(得分:1)

也许你可以尝试其他编码? UTF16,Unicode? 如果你不确定它是否正确编码,请尝试使用另一个exif阅读器查看exif元数据。