Index: src/dlg-search.c
===================================================================
--- src/dlg-search.c	(revision 1515)
+++ src/dlg-search.c	(working copy)
@@ -711,6 +711,7 @@
 	GPatternSpec *spec;
 	gboolean      retval = FALSE;
 	int           i;
+	char	     *norm_pattern;
 
 	if (pattern == NULL)
 		return TRUE;
@@ -718,14 +719,26 @@
 	if ((keywords == NULL) || (keywords[0] == NULL))
 		return FALSE;
 
-	spec = g_pattern_spec_new (pattern);
+	norm_pattern = g_utf8_normalize (pattern,
+	                                 -1,
+	                                 G_NORMALIZE_NFC);
+	spec = g_pattern_spec_new (norm_pattern);
+	g_free (norm_pattern);
+
 	for (i = 0; keywords[i] != NULL; i++) {
 		char     *case_string;
+		char     *norm_string;
 		gboolean  match;
 
 		case_string = g_utf8_casefold (keywords[i], -1);
-		match = g_pattern_match_string (spec, case_string);
+		norm_string = g_utf8_normalize (case_string,
+		                                -1,
+		                                G_NORMALIZE_NFC);
+
+		match = g_pattern_match_string (spec, norm_string);
+
 		g_free (case_string);
+		g_free (norm_string);
 
 		if (match) {
 			retval = TRUE;
@@ -743,6 +756,7 @@
 		const char  *string)
 {
 	char     *case_string;
+	char     *norm_string;
 	int       i;
 	gboolean  retval = FALSE;
 
@@ -753,13 +767,29 @@
 		return FALSE;
 
 	case_string = g_utf8_casefold (string, -1);
+	norm_string = g_utf8_normalize (case_string,
+	                                -1,
+	                                G_NORMALIZE_NFC);
+
 	for (i = 0; patterns[i] != NULL; i++) {
-		if (g_pattern_match_simple (patterns[i], case_string)) {
+		gboolean  match;
+		char     *norm_pattern;
+
+		norm_pattern = g_utf8_normalize (patterns[i],
+                                                 -1,
+	                                         G_NORMALIZE_NFC);
+
+		match = g_pattern_match_simple (norm_pattern, norm_string);
+
+		g_free (norm_pattern);
+
+		if (match) {
 			retval = TRUE;
 			break;
 		}
 	}
 	g_free (case_string);
+	g_free (norm_string);
 
 	return retval;
 }
Index: libgthumb/gth-sort-utils.c
===================================================================
--- libgthumb/gth-sort-utils.c	(revision 1515)
+++ libgthumb/gth-sort-utils.c	(working copy)
@@ -117,9 +117,10 @@
 	/* Based heavily on the Nautilus compare_by_display_name (libnautilus-private/nautilus-file.c)
 	   function, for consistent Nautilus / gthumb behaviour. */
 
-	char *key_1, *key_2;
-	gboolean sort_last_1, sort_last_2;
-	int compare;
+	char     *key_1, *key_2;
+	gboolean  sort_last_1, sort_last_2;
+	int       compare;
+	char     *unesc_name1, *unesc_name2;
 
 	sort_last_1 = file_name_from_path (name1)[0] == SORT_LAST_CHAR1
 			|| file_name_from_path (name1)[0] == SORT_LAST_CHAR2;
@@ -131,13 +132,18 @@
 	} else if (!sort_last_1 && sort_last_2) {
 		compare = -1;
 	} else {
-		key_1 = g_utf8_collate_key_for_filename (file_name_from_path (name1), -1);
-		key_2 = g_utf8_collate_key_for_filename (file_name_from_path (name2), -1);
+		unesc_name1 = gnome_vfs_unescape_string (name1, "");
+		unesc_name2 = gnome_vfs_unescape_string (name2, "");
 
+		key_1 = g_utf8_collate_key_for_filename (file_name_from_path (unesc_name1), -1);
+		key_2 = g_utf8_collate_key_for_filename (file_name_from_path (unesc_name2), -1);
+
 		compare = strcmp (key_1, key_2);
 
 		g_free(key_1);
 		g_free(key_2);
+		g_free(unesc_name1);
+		g_free(unesc_name2);
 	}
 
 	return compare;
Index: libgthumb/gtk-utils.c
===================================================================
--- libgthumb/gtk-utils.c	(revision 1515)
+++ libgthumb/gtk-utils.c	(working copy)
@@ -295,7 +295,10 @@
 	/* Run dialog */
 
 	if (gtk_dialog_run (GTK_DIALOG (d)) == GTK_RESPONSE_YES)
-		result = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
+		/* Normalize unicode text to "NFC" form for consistency. */
+		result = g_utf8_normalize (gtk_entry_get_text (GTK_ENTRY (entry)),
+					   -1,
+					   G_NORMALIZE_NFC);
 	else
 		result = NULL;
 
