diff -pru dillo/src/IO/file.c dillo.orig/src/IO/file.c
--- dillo/src/IO/file.c	Thu Jul 19 23:55:48 2001
+++ dillo.orig/src/IO/file.c	Sat Aug 11 09:36:36 2001
@@ -283,7 +283,7 @@ void File_get(ChainLink *Info, void *Dat
    else if (!strcmp(path, "~") || !strcmp(path, "~/"))
       filename = g_strdup(g_get_home_dir());
    else
-      filename = g_strdup(path);
+      filename = a_Url_parse_hex_path(Url);
 
    if ( stat(filename, &sb) != 0 ) {
       /* stat failed, prepare a file-not-found error. */
diff -pru dillo/src/url.c dillo.orig/src/url.c
--- dillo/src/url.c	Sun Jul  8 00:04:57 2001
+++ dillo.orig/src/url.c	Sat Aug 11 10:20:47 2001
@@ -521,3 +521,60 @@ void a_Url_set_ismap_coords(DilloUrl *u,
    }
 }
 
+/*
+ * Given an hex octet (e3, 2F, 20), return the corresponding 
+ * character if the octet is valid, and -1 otherwise
+ */
+static int Url_parse_hex_octet(const gchar *s)
+{
+   if ( *s && *(s+1) ) {
+      gchar *tail, *head = g_strndup(s, 2);
+      int hex_value = strtol(head, &tail, 16);
+      
+      if (tail - head == 2) {
+	 g_free(head);
+	 return hex_value;
+      }
+      g_free(head);
+   }
+   
+   return -1;
+}
+
+/*
+ * Parse possible hexadecimal octets in the URI path
+ * Returns new allocated string.
+ */
+gchar *a_Url_parse_hex_path(const DilloUrl *u)
+{
+   gchar *new_uri, *dest_ptr, *src_ptr;
+   int hex_value;
+   
+   if ( !u || !u->path || !u->path->len)
+      return NULL;
+
+   /* most cases won't have hex octets */
+   if (!strchr(u->path->str, '%'))
+      return g_strdup(u->path->str);
+
+   src_ptr = u->path->str;
+   dest_ptr = new_uri = g_malloc(sizeof(gchar)*(u->path->len+1));
+   
+   while (*src_ptr) {
+      if (*src_ptr == '%') {
+	 if ((hex_value = Url_parse_hex_octet(src_ptr+1)) == -1) {
+	    *dest_ptr++ = *src_ptr++;
+	 }
+	 else {
+	    *dest_ptr++ = hex_value;
+	    src_ptr+=3;
+	 }
+      }
+      else
+	 *dest_ptr++ = *src_ptr++;
+   }
+   
+   *dest_ptr++ = 0;
+   new_uri = g_realloc(new_uri, sizeof(gchar)*(dest_ptr-new_uri));
+   return new_uri;
+}
diff -pru dillo/src/url.h dillo.orig/src/url.h
--- dillo/src/url.h	Thu Jul 19 23:55:45 2001
+++ dillo.orig/src/url.h	Sat Aug 11 09:55:37 2001
@@ -106,6 +106,7 @@ void a_Url_set_data(DilloUrl *u, gchar *
 void a_Url_set_alt(DilloUrl *u, gchar *alt);
 void a_Url_set_pos(DilloUrl *u, gint pos);
 void a_Url_set_ismap_coords(DilloUrl *u, gchar *coord_str);
+gchar *a_Url_parse_hex_path(const DilloUrl *u);
 
 #ifdef __cplusplus
 }

