11

我正在使用一个名为EXIFextractor的库从图像中提取元数据信息。这个库部分使用System.Drawing.Imaging.PropertyItem来完成所有艰苦的工作。根据 Microsoft 文档,PropertyItem 中的某些数据(例如图像详细信息等)被提取为存储在 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

4 回答 4

40
string yourText = System.Text.Encoding.UTF8.GetString(yourByteArray);
于 2010-08-04T13:53:17.880 回答
4

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

于 2010-08-04T13:53:07.037 回答
2

是的,这是生成图像的应用程序或相机的问题。EXIF 标准对文本的支持很糟糕,它必须以 ASCII 编码。只有当摄影师会说英语时,这种方法才会奏效。毫无疑问,编码图像的软件忽略了这一要求。这也是 PropertyItem 类正在做的事情,它使用 Marshal.StringToHGlobalAnsi() 将字符串编码为 byte[],它假定系统的默认代码页。

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

于 2010-08-04T15:10:20.997 回答
1

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

于 2010-08-04T14:44:16.057 回答