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

C#:将字节[]转换为UTF8编码字符串,c#,character-encoding,exif,C#,Character Encoding,Exif,我正在使用一个名为的库从图像中提取元数据信息。这个库部分使用System.Drawing.Imaging.PropertyItem来完成所有的艰苦工作。根据Microsoft文档,PropertyItem中的一些数据(如图像详细信息等)以ASCII字符串的形式获取,该字符串存储在字节[]中 我的问题是,国际字符(å、ä、ö等)被删除,取而代之的是问号。调试代码时,字节[]显然是UTF-8的表示形式 我想将byte[]解析为UTF8字符串,如何在这个过程中不丢失任何信息 提前谢谢 更新: 我被要

我正在使用一个名为的库从图像中提取元数据信息。这个库部分使用System.Drawing.Imaging.PropertyItem来完成所有的艰苦工作。根据Microsoft文档,PropertyItem中的一些数据(如图像详细信息等)以ASCII字符串的形式获取,该字符串存储在字节[]中

我的问题是,国际字符(å、ä、ö等)被删除,取而代之的是问号。调试代码时,字节[]显然是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()); 

我还尝试了其他几种方法从数据中获取我珍贵的å,ä,ö,但似乎没有任何效果。我开始认为汉斯·帕桑在下面的回答中得出的结论是正确的

对对象使用该方法。

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

是的,这是生成图像的应用程序或相机的问题。EXIF标准对文本有着可怕的支持,它必须用ASCII编码。只有当摄影师说英语时,这才行得通。毫无疑问,编码图像的软件忽略了这一要求。这也是PropertyItem类所做的,它使用Marshal.StringToHGlobalAnsi()将字符串编码为byte[],它假定系统的默认代码页


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

谢谢你的快速回答。不过我已经试过了。不走运。我开始怀疑这些源(图像文件)的编码是否正确。如果你能分享一个例子,我们可以自己检查或尝试。当然。既然我是新来的,我应该提供它作为一个答案或在评论或什么是这样做的首选方式?你应该编辑和更新你的问题。文本中用粗体的“更新”标签加上“新”内容就可以了。请参阅我在Hans Passant回答中的评论。如果信息是使用ASCII编码读取的,那么任何非ASCII字符都将无法正确读取。这种先用编码读取字符,然后再写入字节数组的做法听起来不太正确。你能链接到说明这种情况的文档吗?在这里,如果允许我发布另一个超链接:)这是我所期望的。然而,我仍然希望Photoshop和XMP的内置工具能够把事情弄清楚。对于如何解决这个问题,有什么建议吗?我的公司有很多编码错误的文件,所以最好使用批处理程序。字节数组中的所有字节根据您的区域设置是否仍然正确?如果是,您可以尝试使用您的区域设置而不是UTF8/ascii进行编码/解码。请看,我下载了一个名为GeoSetter的应用程序,用于对照片进行地理标记,但它也具有读取和写入EXIF和IPTC元数据的功能。它告诉我元数据是UTF-8编码的,并且正确显示了瑞典语字符。我想知道您是否可以添加这样一个图片的示例(如果允许的话)。您也可以编辑图片,只要EXIF数据仍然被写入。我可能正朝着正确的方向寻求解决方案。我已设法编辑EXIFextractor类,以便立即将字节数组转换为正确编码的字符串。我将进行更多的研究,很快就能判断我的理论是否成立!
string yourText = System.Text.Encoding.UTF8.GetString(yourByteArray);