diff --git a/gst-libs/gst/tag/id3v2frames.c b/gst-libs/gst/tag/id3v2frames.c
index f9ba222..781f76c 100644
--- a/gst-libs/gst/tag/id3v2frames.c
+++ b/gst-libs/gst/tag/id3v2frames.c
@@ -955,12 +955,189 @@ find_utf16_bom (gchar * data, const gchar ** p_in_encoding)
   return FALSE;
 }
 
+static GList *
+get_possible_charsets(void)
+{
+  const char *alias;
+  const char *raw;
+  char *prefix;
+  int i,j;
+  GList *sets = NULL;
+
+  /* Get the list from glibc-2.11.3/localedata/SUPPORTED */
+  static struct {
+    const char *charset;
+    const char *alias;
+  } charset_names[] = {
+
+    {
+      "GEORGIAN-PS",
+      "ka_GE\0",
+    },
+    {
+      "GBK",
+      "zh_SG.GBK\0zh_CN.GBK\0",
+    },
+    {
+      "EUC-TW",
+      "zh_TW.EUC-TW\0",
+    },
+    {
+      "CP1255",
+      "yi_US\0",
+    },
+    {
+      "CP1251",
+      "bg_BG\0be_BY\0",
+    },
+    {
+      "PT154",
+      "kk_KZ\0",
+    },
+    {
+      "BIG5-HKSCS",
+      "zh_HK\0",
+    },
+    {
+      "EUC-JP",
+      "ja_JP.EUC-JP\0",
+    },
+    {
+      "GB2312",
+      "zh_SG\0zh_CN\0",
+    },
+    {
+      "ARMSCII-8",
+      "hy_AM.ARMSCII-8\0",
+    },
+    {
+      "GB18030",
+      "zh_CN.GB18030\0",
+    },
+    {
+      "ISO-8859-9",
+      "tr_TR\0tr_CY\0ku_TR\0",
+    },
+    {
+      "ISO-8859-8",
+      "iw_IL\0he_IL\0",
+    },
+    {
+      "ISO-8859-7",
+      "el_CY\0el_GR\0",
+    },
+    {
+      "ISO-8859-6",
+      "ar_YE\0ar_TN\0ar_SY\0ar_SD\0ar_SA\0ar_QA\0ar_OM\0ar_MA\0ar_LY\0ar_LB\0ar_KW\0ar_JO\0ar_IQ\0ar_EG\0ar_DZ\0ar_BH\0ar_AE\0",
+    },
+    {
+      "ISO-8859-5",
+      "ru_RU\0mk_MK\0",
+    },
+    {
+      "ISO-8859-3",
+      "mt_MT\0",
+    },
+    {
+      "ISO-8859-2",
+      "sl_SI\0sk_SK\0ro_RO\0pl_PL\0hu_HU\0hsb_DE\0hr_HR\0cs_CZ\0bs_BA\0",
+    },
+    {
+      "BIG5",
+      "zh_TW\0",
+    },
+    {
+      "KOI8-T",
+      "tg_TJ\0",
+    },
+    {
+      "KOI8-U",
+      "uk_UA\0ru_UA\0",
+    },
+    {
+      "EUC-KR",
+      "ko_KR.EUC-KR\0",
+    },
+    {
+      "KOI8-R",
+      "ru_RU.KOI8-R\0",
+    },
+    {
+      "TIS-620",
+      "th_TH\0",
+    },
+    {
+      "ISO-8859-15",
+      "wa_BE@euro\0sv_FI@euro\0pt_PT@euro\0nl_NL@euro\0nl_BE@euro\0mg_MG\0it_IT@euro\0gl_ES@euro\0gd_GB\0ga_IE@euro\0fr_LU@euro\0fr_FR@euro\0fr_BE@euro\0fi_FI@euro\0eu_ES@euro\0et_EE.ISO-8859-15\0es_ES@euro\0en_IE@euro\0de_LU@euro\0de_DE@euro\0de_BE@euro\0de_AT@euro\0ca_IT\0ca_FR\0ca_ES@euro\0ca_AD\0br_FR@euro\0ast_ES\0an_ES\0",
+    },
+    {
+      "ISO-8859-14",
+      "cy_GB\0",
+    },
+    {
+      "ISO-8859-13",
+      "mi_NZ\0lv_LV\0lt_LT\0",
+    },
+    {
+      "TCVN5712-1",
+      "vi_VN.TCVN\0",
+    },
+    {
+      "ISO-8859-10",
+      "lg_UG\0",
+    },
+
+  };
+
+#define CHARSET_NAME_LEN sizeof(charset_names)/sizeof(charset_names[0])
+
+  raw = g_getenv ("LC_ALL");
+
+  if (raw == NULL) {
+    raw = g_getenv ("LC_CTYPE");
+  }
+
+  if (raw == NULL) {
+    raw = g_getenv ("LANG");
+  }
+
+  if (raw == NULL) {
+    return NULL;
+  }
+
+  if (g_str_has_suffix (raw, ".UTF-8")) {
+    int len;
+    len = strlen(raw);
+    prefix = g_strndup(raw, len - 6);
+  } else {
+    return NULL;
+  }
+
+  for (i = 0; i < CHARSET_NAME_LEN; i++) {
+    alias = charset_names[i].alias;
+    j = 0;
+    while (alias[j] != '\0') {
+      if (g_str_has_prefix (alias + j, prefix)) {
+        sets = g_list_append (sets, (gpointer)charset_names[i].charset);
+        break;
+      } else {
+        j += strlen (alias + j) + 1;
+      }
+    }
+  }
+
+  g_free (prefix);
+
+  return sets;
+}
+
 static void *
 string_utf8_dup (const gchar * start, const guint size)
 {
   const gchar *env;
   gsize bytes_read;
   gchar *utf8;
+  GList *l, *iter;
 
   /* Should we try the charsets specified
    * via environment variables FIRST ? */
@@ -1005,6 +1182,23 @@ string_utf8_dup (const gchar * start, const guint size)
     }
   }
 
+  /* Try possible charset according to current locale */
+  l = get_possible_charsets ();
+
+  if (l != NULL) {
+    for (iter = l; iter; iter = iter->next) {
+      if ((utf8 = g_convert(start, size, "UTF-8", (const gchar *)iter->data,
+                            &bytes_read, NULL, NULL))) {
+        if (bytes_read == size) {
+          g_list_free (l);
+          goto beach;
+        }
+      }
+      g_free (utf8);
+    }
+    g_list_free (l);
+  }
+
   /* Try ISO-8859-1 */
   utf8 =
       g_convert (start, size, "UTF-8", "ISO-8859-1", &bytes_read, NULL, NULL);
