diff --git a/Makefile b/Makefile
index 62d72ea62cccfa57664f1708a1d8b5fc029ce20d..85c45eda460793efda32e1314da7c0a82062e44b 100644
--- a/Makefile
+++ b/Makefile
@@ -2146,9 +2146,9 @@ CHECK_NEWLINES:=./bin/check_newlines$(EXE)
 $(CHECK_NEWLINES): bin/check_newlines.ml
 	$(PRINT_MAKING)	$@
 ifeq ($(OCAMLBEST),opt)
-	$(OCAMLOPT) unix.cmxa $< -o $@
+	$(OCAMLOPT) str.cmxa unix.cmxa $< -o $@
 else
-	$(OCAMLC) unix.cma $< -o $@
+	$(OCAMLC) str.cma unix.cma $< -o $@
 endif
 
 check-newlines-clean:
@@ -2161,9 +2161,9 @@ ISUTF8:=./bin/isutf8$(EXE)
 $(ISUTF8): bin/isutf8.ml
 	$(PRINT_MAKING)	$@
 ifeq ($(OCAMLBEST),opt)
-	$(OCAMLOPT) $< -o $@
+	$(OCAMLOPT) str.cmxa $< -o $@
 else
-	$(OCAMLC) $< -o $@
+	$(OCAMLC) str.cma $< -o $@
 endif
 
 isutf8-clean:
diff --git a/bin/check_newlines.ml b/bin/check_newlines.ml
index df74f3ae3dc3c7ae9f78588ddc9d6213fc78c462..b2166d668d639dc8746cbb2fd443b277dd849f9e 100644
--- a/bin/check_newlines.ml
+++ b/bin/check_newlines.ml
@@ -1,5 +1,17 @@
 module StringSet = Set.Make(String)
 
+let unquote_filename filename =
+  let n = String.length filename in
+  let r =
+    if n > 1 && String.get filename 0 = '"' &&
+       String.get filename (n - 1) = '"'
+    then
+      String.sub filename 1 (n-2)
+    else
+      filename
+  in
+  Str.global_replace (Str.regexp "\\\\") "" r
+
 (* returns true for empty files *)
 let is_last_byte_newline filename =
   try
@@ -17,9 +29,10 @@ let is_last_byte_newline filename =
       close_in ic;
       true
   with
-  | Sys_error _ ->
+  | Sys_error msg ->
     (* possibly a non-existing file (e.g. with spaces); ignoring *)
-    Format.printf "could not open, ignoring file: %s" filename;
+    Format.printf "check_newlines: cannot open, ignoring file: %s (%s)@."
+      filename msg;
     true
 
 (* usage: first argument is a file name containing a list of files
@@ -38,6 +51,13 @@ let () =
     try
       while true; do
         let filename = input_line file_list_ic in
+        let filename =
+          (* assume no empty filenames *)
+          if String.get filename 0 = '"' then
+            unquote_filename filename
+          else
+            filename
+        in
         if not (StringSet.mem filename to_ignore) &&
            not (is_last_byte_newline filename) then begin
           incr errors;
diff --git a/bin/isutf8.ml b/bin/isutf8.ml
index ccfedc4685785beb706d7fa65dfc88f013719fc1..3e3ddef4e6e75ad9dee3009b06ffa1e925eb4254 100644
--- a/bin/isutf8.ml
+++ b/bin/isutf8.ml
@@ -1,5 +1,17 @@
 module StringSet = Set.Make(String)
 
+let unquote_filename filename =
+  let n = String.length filename in
+  let r =
+    if n > 1 && String.get filename 0 = '"' &&
+       String.get filename (n - 1) = '"'
+    then
+      String.sub filename 1 (n-2)
+    else
+      filename
+  in
+  Str.global_replace (Str.regexp "\\\\") "" r
+
 exception False
 
 let is_valid_utf8 filename =
@@ -32,14 +44,16 @@ let is_valid_utf8 filename =
       !extra = 0
     with
     | End_of_file ->
+      close_in ic;
       !extra = 0
     | False ->
       close_in ic;
       false
   with
-  | Sys_error _ ->
+  | Sys_error msg ->
     (* possibly a non-existing file (e.g. with spaces); ignoring *)
-    Format.printf "could not open, ignoring file: %s" filename;
+    Format.printf "isutf8: cannot open, ignoring file: %s (%s)@."
+      filename msg;
     true
 
 (* usage: first argument is a file name containing a list of files
@@ -57,6 +71,13 @@ let () =
     try
       while true; do
         let filename = input_line file_list_ic in
+        let filename =
+          (* assume no empty filenames *)
+          if String.get filename 0 = '"' then
+            unquote_filename filename
+          else
+            filename
+        in
         if not (StringSet.mem filename to_ignore)
         && not (is_valid_utf8 filename) then begin
           incr errors;