我使用名为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在下面的答案中对他的结论是正确的。
答案 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元数据。