diff --git a/src/term.rs b/src/term.rs
index 1e08c84f..2f461397 100644
--- a/src/term.rs
+++ b/src/term.rs
@@ -247,12 +247,16 @@ pub fn terminal_file_link<'a>(
     canonical_path: &str,
     color: Color,
 ) -> io::Result<()> {
+    let encoded_spaces_canonical_path = encode_spaces(canonical_path);
+
     writer
         .stdout()
         .queue(SetForegroundColor(color))?
         .queue(SetAttribute(Attribute::Underlined))?;
     writer.stdout().write_all(b"\x1b]8;;file://")?;
-    writer.stdout().write_all(canonical_path.as_bytes())?;
+    writer
+        .stdout()
+        .write_all(encoded_spaces_canonical_path.as_bytes())?;
     writer.stdout().write_all(b"\x1b\\")?;
     // Only this part is visible.
     writer.write_str(path)?;
@@ -265,6 +269,10 @@ pub fn terminal_file_link<'a>(
     Ok(())
 }
 
+fn encode_spaces(path: &str) -> String {
+    path.replace(" ", "%20")
+}
+
 pub fn write_ansi(output: &mut Vec<u8>, command: impl Command) {
     struct FmtWriter<'a>(&'a mut Vec<u8>);