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

12
我正在使用名为EXIFextractor的库从图像中提取元数据信息。该库部分使用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在下面的答案中得出的结论是正确的。


如果使用ASCII编码读取信息,则任何非ASCII字符都将无法正确读取。这种使用编码读取字符,然后写入字节数组的方式似乎不太对。您能否提供说明此情况的文档链接? - Paul Turner
1
这里是另一个超链接,如果我被允许发布的话 :) http://msdn.microsoft.com/zh-cn/library/system.drawing.imaging.propertyitem.type.aspx - dotmartin
4个回答

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

1
感谢您的迅速回复。然而,我已经尝试过这个方法了,但是没有成功。我开始怀疑源文件(图像文件)是否一开始就被正确编码了。 - dotmartin
如果您能分享一个例子,我们可以检查或自己尝试。 - Scoregraphic
1
当然可以。由于我是新手,我应该将其作为答案提供还是在评论中提供?哪种方式更受欢迎呢? - dotmartin
你应该编辑和更新你的问题。在文本中加粗一个带有“更新”标签的部分,附上“新”的内容即可。 - Scoregraphic
请查看我在Hans Passant的答案中的评论。 - Scoregraphic
好的,看起来这似乎是解决方案。至少在某种程度上是这样的。我只是对编码有些疑问。元数据似乎是使用ISO-8859-1编码的,这很合理,因为我们所有的站点都在使用Windows。所以我只需创建一个编码器: Encoding enc = Encoding.GetEncoding("ISO-8859-1");然后我使用它来解码字节数组: v = enc.GetString(p.Value,0,p.Len - 1); 这里p代表ProperyItem。这似乎有效!感谢您的帮助和热情。我对您的热情和乐于助人印象深刻。真希望我也能以同样的方式做出贡献!再次感谢! - dotmartin

4

2
是的,这是应用程序或相机产生图像时存在的问题。 EXIF标准对文本支持很差,必须用ASCII编码。 只有当摄影师讲英语时才能完全使用。 毫无疑问,编码图像的软件正在忽略此要求。 PropertyItem类也是如此,它使用Marshal.StringToHGlobalAnsi()将字符串编码为byte [],假定系统的默认代码页。
目前没有明显的解决方法,当照片距离您的计算机太远时,您将会得到乱码。

1
这正是我所期望的。然而,我仍然希望Photoshop和XMP内置工具能够解决问题。有没有什么建议可以解决这个问题?我的公司有很多编码错误的文件,因此最好使用批处理器。 - dotmartin
在字节数组中,所有的字节是否仍然符合您的语言环境?如果是的话,您可以尝试使用您的语言环境进行编码/解码,而不是使用UTF8 / ascii。请参阅http://msdn.microsoft.com/en-us/library/system.text.encoding.getencoding.aspx。 - Scoregraphic
1
我下载了一个叫做GeoSetter的应用程序,用于给照片添加地理标记,但它还具有读写EXIF和IPTC元数据的功能。它告诉我元数据是UTF-8编码的,并且可以正确显示瑞典字符。 - dotmartin
我想知道是否可以添加这样一张图片的示例(如果允许的话)。您也可以编辑图片,只要EXIF数据仍然被写入。 - Scoregraphic
我可能正在朝着解决方案的正确方向前进。我已经成功地编辑了EXIFextractor类,将字节数组直接转换为正确编码的字符串。我将进行更多的研究,很快就能知道我的理论是否成立! - dotmartin

1

也许你可以尝试另一种编码方式?UTF16,Unicode? 如果你不确定它是否在第一次编码时正确地编码,请尝试使用另一个exif阅读器查看exif元数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接