--- gst-plugins-good/gst/id3demux/id3v2frames.c.orig	2006-06-11 20:31:40.000000000 +0800
+++ gst-plugins-good/gst/id3demux/id3v2frames.c	2006-06-11 21:09:06.000000000 +0800
@@ -682,6 +682,72 @@
   return FALSE;
 }
 
+static void*
+string_utf8_dup (const gchar * start, const guint size)
+{
+  const gchar *env;
+  gsize bytes_read;
+  gchar *utf8;
+
+  /* Should we try the charsets specified
+   * via environment variables FIRST ? */
+  if (g_utf8_validate (start, size, NULL)) {
+    utf8 = g_strndup (start, size);
+    goto beach;
+  }
+
+  env = g_getenv ("GST_ID3V1_TAG_ENCODING");
+  if (!env || *env == '\0')
+    env = g_getenv ("GST_ID3_TAG_ENCODING");
+  if (!env || *env == '\0')
+    env = g_getenv ("GST_TAG_ENCODING");
+
+  /* Try charsets specified via the environment */
+  if (env && *env != '\0') {
+    gchar **c, **csets;
+
+    csets = g_strsplit (env, G_SEARCHPATH_SEPARATOR_S, -1);
+
+    for (c = csets; c && *c; ++c) {
+      if ((utf8 =
+              g_convert (start, size, "UTF-8", *c, &bytes_read, NULL, NULL))) {
+        if (bytes_read == size) {
+          g_strfreev (csets);
+          goto beach;
+        }
+        g_free (utf8);
+        utf8 = NULL;
+      }
+    }
+  }
+  /* Try current locale (if not UTF-8) */
+  if (!g_get_charset (&env)) {
+    if ((utf8 = g_locale_to_utf8 (start, size, &bytes_read, NULL, NULL))) {
+      if (bytes_read == size) {
+        goto beach;
+      }
+      g_free (utf8);
+      utf8 = NULL;
+    }
+  }
+
+  /* Try ISO-8859-1 */
+  utf8 =
+      g_convert (start, size, "UTF-8", "ISO-8859-1", &bytes_read, NULL, NULL);
+  if (utf8 != NULL && bytes_read == size) {
+    goto beach;
+  }
+
+  g_free (utf8);
+  return NULL;
+
+beach:
+
+  g_strchomp (utf8);
+
+  return (utf8);
+}
+
 static void
 parse_insert_string_field (guint8 encoding, gchar * data, gint data_size,
     GArray * fields)
@@ -719,8 +785,7 @@
 
       break;
     case ID3V2_ENCODING_ISO8859:
-      field = g_convert (data, data_size, "UTF-8", "ISO-8859-1",
-          NULL, NULL, NULL);
+      field = string_utf8_dup(data, data_size);
       break;
     default:
       field = g_strndup (data, data_size);
