diff -ur gst-plugins-0.8.2/ext/mad/gstid3tag.c gst-plugins-0.8.2-tag/ext/mad/gstid3tag.c
--- gst-plugins-0.8.2/ext/mad/gstid3tag.c	2004-06-22 19:35:06.000000000 +0800
+++ gst-plugins-0.8.2-tag/ext/mad/gstid3tag.c	2004-07-29 13:23:31.238027600 +0800
@@ -537,6 +537,7 @@
     const union id3_field *field;
     unsigned int nstrings, j;
     const gchar *tag_name;
+    enum id3_field_textencoding encoding = 0xff;
 
     /* find me the function to query the frame id */
     gchar *id = g_strndup (frame->id, 5);
@@ -547,6 +548,10 @@
       continue;
     }
 
+    field = id3_frame_field(frame, 0);
+    if(id3_field_type(field) == ID3_FIELD_TYPE_TEXTENCODING)
+      encoding = field->number.value;
+
     field = &frame->fields[1];
     nstrings = id3_field_getnstrings (field);
 
@@ -557,7 +562,20 @@
       if (strcmp (id, ID3_FRAME_GENRE) == 0)
         ucs4 = id3_genre_name (ucs4);
 
-      utf8 = id3_ucs4_utf8duplicate (ucs4);
+      utf8 = NULL;
+      if(encoding == ID3_FIELD_TEXTENCODING_ISO_8859_1) {
+        //"iso-8859-1" is not really iso-8859-1,
+	//it means "locale depending encoding"
+	char * iso8859;
+
+	iso8859 = id3_ucs4_latin1duplicate(ucs4);
+	utf8 = g_locale_to_utf8(iso8859, -1, NULL, NULL, NULL);
+	free(iso8859);
+      }
+
+      if (utf8 == 0)
+        utf8 = id3_ucs4_utf8duplicate (ucs4);
+
       if (utf8 == 0)
         continue;
 
