diff --git a/capplets/keyboard/gnome-keyboard-properties-xkb.c b/capplets/keyboard/gnome-keyboard-properties-xkb.c
index 4ac249d..02f33e5 100644
--- a/capplets/keyboard/gnome-keyboard-properties-xkb.c
+++ b/capplets/keyboard/gnome-keyboard-properties-xkb.c
@@ -48,8 +48,14 @@ char *
 xci_desc_to_utf8 (XklConfigItem * ci)
 {
 	char *sd = g_strstrip (ci->description);
-	return sd[0] == 0 ? g_strdup (ci->name) :
-	    g_locale_to_utf8 (sd, -1, NULL, NULL, NULL);
+	if (sd[0] == 0) {
+		return g_strdup (ci->name);
+	} else if (g_utf8_validate (sd, -1, NULL)) {
+		return g_strdup (sd);
+	} else {
+		/* Old versions of xklavier didn't encode the description in UTF-8 */
+		return g_locale_to_utf8 (sd, -1, NULL, NULL, NULL);
+	}
 }
 
 static void
diff --git a/capplets/keyboard/gnome-keyboard-properties-xkblt.c b/capplets/keyboard/gnome-keyboard-properties-xkblt.c
index 7670968..845a64d 100644
--- a/capplets/keyboard/gnome-keyboard-properties-xkblt.c
+++ b/capplets/keyboard/gnome-keyboard-properties-xkblt.c
@@ -369,10 +369,14 @@ xkb_layout_description_utf8 (const gchar * visible)
 	if (gkbd_keyboard_config_get_descriptions
 	    (config_registry, visible, &sl, &l, &sv, &v))
 		visible = gkbd_keyboard_config_format_full_layout (l, v);
-	v1 = g_strdup (visible);
-	utf_visible =
-	    g_locale_to_utf8 (g_strstrip (v1), -1, NULL, NULL, NULL);
-	g_free (v1);
+	v1 = g_strstrip (g_strdup (visible));
+	if (g_utf8_validate (v1, -1, NULL)) {
+		utf_visible = v1;
+	} else {
+		/* Old versions of xklavier didn't encode the description in UTF-8 */
+		utf_visible = g_locale_to_utf8 (v1, -1, NULL, NULL, NULL);
+		g_free (v1);
+	}
 	return utf_visible;
 }
 
