Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对标记为ASCII的EXIF属性使用UTF8解码是否安全?_C#_.net_Gdi+_Exif - Fatal编程技术网

C# 对标记为ASCII的EXIF属性使用UTF8解码是否安全?

C# 对标记为ASCII的EXIF属性使用UTF8解码是否安全?,c#,.net,gdi+,exif,C#,.net,Gdi+,Exif,我收到了一个包含EXIF ImageDescription元数据的图像文件,该元数据的值为“Test accents:è–èè”。当使用.NET GDI+类提取此数据时,它会报告它存储为ASCII,但在使用ASCII解码器时会收到垃圾数据。通过反复试验,我发现我可以使用UTF8解码器正确地提取它 以下是示例代码: public string GetDescription() { const string filePath = @"C:\test_image.jpg"; using (v

我收到了一个包含EXIF ImageDescription元数据的图像文件,该元数据的值为“Test accents:è–èè”。当使用.NET GDI+类提取此数据时,它会报告它存储为ASCII,但在使用ASCII解码器时会收到垃圾数据。通过反复试验,我发现我可以使用UTF8解码器正确地提取它

以下是示例代码:

public string GetDescription()
{
  const string filePath = @"C:\test_image.jpg";

  using (var bmp = new System.Drawing.Bitmap(filePath))
  {
    var propItem = bmp.PropertyItems.FirstOrDefault(p => p.Id == 270); // EXIF ImageDescription

    if (propItem == null)
      return null;

    string value = null;

    if (propItem.Type == 2) // ASCII
    {
      // Does not work: Returns "Test accents: ??????????"
      var asciiEnc = new System.Text.ASCIIEncoding();
      value = asciiEnc.GetString(propItem.Value, 0, propItem.Value.Length - 1);

      // CORRECT: Returns "Test accents: éâäàè"
      var utf8Enc = new System.Text.UTF8Encoding();
      value = utf8Enc.GetString(propItem.Value, 0, propItem.Value.Length - 1);
    }

    return value;
  }
}
我正在考虑更改生产代码,以便在提取元属性时始终使用UTF8解码器,即使PropertyItem.Type指示它是ASCII。这在这种情况下当然有效,但我会把它扔给你们,以防我错过了一个不可预见的后果

那么-在提取ASCII元数据时使用UTF8解码器是个坏主意吗

PS:我还尝试使用以下代码使用BitmapMetadata类提取数据,但结果不正确。如果有一个可靠的方法来使用这项技术,我是开放的

// Returns incorrect string: "Test accents: éâäà è"
var value = bitmapMetadata.GetQuery("/app1/ifd/{ushort=270}") as string;

你不可能得到可靠的结果。Exif遭受着常见的编码痛苦,Exif标准规定只能使用7位ASCII码,但每个人都忽略了它。他们必须这样做,ASCII不能正确地编码多种语言中的文本。顺便说一句,Exif来自日本,这个国家的一种语言很少使用ASCII,并且存在许多编码问题。所以每个人都选择适合自己的编码,可以是UTF8,也可以是ANSI,也可以是创建图像时常用的代码页

在岩石和坚硬的地方之间,使用UTF8编码是最好的选择。它不能很好地处理在ANSI代码页中编码的文本,您对此无能为力。默认值是一个糟糕的第二选择。图像中的文本实际上是utf-8编码的


但是是的,如果文本实际上是纯ASCII,那么UTF8编码就可以了。Utf-8以同样的方式编码ASCII码。

您无法获得可靠的编码。Exif遭受着常见的编码痛苦,Exif标准规定只能使用7位ASCII码,但每个人都忽略了它。他们必须这样做,ASCII不能正确地编码多种语言中的文本。顺便说一句,Exif来自日本,这个国家的一种语言很少使用ASCII,并且存在许多编码问题。所以每个人都选择适合自己的编码,可以是UTF8,也可以是ANSI,也可以是创建图像时常用的代码页

在岩石和坚硬的地方之间,使用UTF8编码是最好的选择。它不能很好地处理在ANSI代码页中编码的文本,您对此无能为力。默认值是一个糟糕的第二选择。图像中的文本实际上是utf-8编码的

但是是的,如果文本实际上是纯ASCII,那么UTF8编码就可以了。Utf-8以相同的方式对ASCII码进行编码。

因此在(Python中)我们

当然,我相信每个人都应该只对任何连接到磁盘(或有线)的东西使用UTF8。使用ANSI编码(或者在微软的其他操作系统中被称为ANSI编码)应该被视为违法行为而受到惩罚。

因此在(Python中)我们


当然,我相信每个人都应该只对任何连接到磁盘(或有线)的东西使用UTF8。使用ANSI编码(或在微软的其他操作系统中如何称呼)应被视为违法行为予以处罚。

重音符号无效
ASCII
,很可能被表示为
ISO-8859-1
重音符号无效
ASCII
,更可能的是,它被表示为
ISO-8859-1
,我想EXIF之所以有这些神秘的限制,是因为它确实是TIFF格式,非常古老。他们仍然可以选择使用不同于ASCII的数据类型,并将字符集定义为UTF8,但……甚至不要建议使用ANSI编码或其他无意义的方法。请大家,只对任何进入磁盘(或有线)的东西使用UTF8。我想EXIF有这些神秘限制的原因是,它确实是TIFF格式,非常古老。他们仍然可以选择使用不同于ASCII的数据类型,并将字符集定义为UTF8,但……甚至不要建议使用ANSI编码或其他无意义的方法。请大家,UTF8只适用于磁盘(或有线)上的任何内容。
self._md["Iptc.Envelope.CharacterSet"] = ['\x1b%G', ]