diff -Nur gst-plugins-good0.10-0.10.6/gst/id3demux/id3v2frames.c gst-plugins-good0.10-0.10.6.new/gst/id3demux/id3v2frames.c
--- gst-plugins-good0.10-0.10.6/gst/id3demux/id3v2frames.c	2007-06-13 04:21:11.000000000 -0500
+++ gst-plugins-good0.10-0.10.6.new/gst/id3demux/id3v2frames.c	2007-11-11 15:14:14.208690514 -0600
@@ -927,6 +927,73 @@
   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) {
+		  GST_DEBUG ("Using charset %s to interperate id3 tags\n", c);
+          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)
@@ -967,8 +1034,9 @@
       if (g_utf8_validate (data, data_size, NULL))
         field = g_strndup (data, data_size);
       else
-        field = g_convert (data, data_size, "UTF-8", "ISO-8859-1",
-            NULL, NULL, NULL);
+        /* 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);
