diff --git a/testsuite/driver/testlib.py b/testsuite/driver/testlib.py
index 79d2b15eecc73cb862703b30bf4f7587e18ab889..bb8f5318d0b4e3a2d0bf0a74f187df0a4247fbee 100644
--- a/testsuite/driver/testlib.py
+++ b/testsuite/driver/testlib.py
@@ -2598,8 +2598,9 @@ def normalise_errmsg(s: str) -> str:
     s = normalise_callstacks(s)
     s = normalise_type_reps(s)
 
-    # normalise slashes, minimise Windows/Unix filename differences
-    s = re.sub(r'\\', '/', s)
+    # normalise slashes to minimise Windows/Unix filename differences,
+    # but don't normalize backslashes in chars
+    s = re.sub(r"(?!')\\", '/', s)
 
     # Normalize the name of the GHC executable. Specifically,
     # this catches the cases that:
diff --git a/testsuite/tests/parser/should_fail/T21843a.stderr b/testsuite/tests/parser/should_fail/T21843a.stderr
index 11ad47d94a982e8392995c39a6c0b09500fc31e1..43428042f09c58fcd30fc0ed66a7d6912f090d96 100644
--- a/testsuite/tests/parser/should_fail/T21843a.stderr
+++ b/testsuite/tests/parser/should_fail/T21843a.stderr
@@ -1,4 +1,4 @@
 
 T21843a.hs:3:13: [GHC-31623]
-    Unicode character '“' ('/8220') looks like '"' (Quotation Mark), but it is not
+    Unicode character '“' ('\8220') looks like '"' (Quotation Mark), but it is not
 
diff --git a/testsuite/tests/parser/should_fail/T21843b.stderr b/testsuite/tests/parser/should_fail/T21843b.stderr
index 34c531c3f814d6cae95c376dee51e7e751d2bbcc..535f1b789b02ca771bc618d36006c260858185f7 100644
--- a/testsuite/tests/parser/should_fail/T21843b.stderr
+++ b/testsuite/tests/parser/should_fail/T21843b.stderr
@@ -1,3 +1,3 @@
 
 T21843b.hs:3:11: [GHC-31623]
-    Unicode character '‘' ('/8216') looks like ''' (Single Quote), but it is not
+    Unicode character '‘' ('\8216') looks like ''' (Single Quote), but it is not
diff --git a/testsuite/tests/parser/should_fail/T21843c.stderr b/testsuite/tests/parser/should_fail/T21843c.stderr
index 54146a42ebbd13e163e152ef09231d563e50ecaa..ea832cb3e4154280891ac900452d295f41dce4ca 100644
--- a/testsuite/tests/parser/should_fail/T21843c.stderr
+++ b/testsuite/tests/parser/should_fail/T21843c.stderr
@@ -1,6 +1,6 @@
 
 T21843c.hs:3:19: [GHC-31623]
-    Unicode character '”' ('/8221') looks like '"' (Quotation Mark), but it is not
+    Unicode character '”' ('\8221') looks like '"' (Quotation Mark), but it is not
 
 T21843c.hs:3:20: [GHC-21231]
-    lexical error in string/character literal at character '/n'
+    lexical error in string/character literal at character '\n'
diff --git a/testsuite/tests/parser/should_fail/T21843d.stderr b/testsuite/tests/parser/should_fail/T21843d.stderr
index 4ee47ed8ef23d8c58ccb33f17ff053da0a6f9cd0..995bbf8c210c5cd09a7f8dd0b52978114e895d94 100644
--- a/testsuite/tests/parser/should_fail/T21843d.stderr
+++ b/testsuite/tests/parser/should_fail/T21843d.stderr
@@ -1,3 +1,3 @@
 
 T21843d.hs:3:13: [GHC-31623]
-    Unicode character '’' ('/8217') looks like ''' (Single Quote), but it is not
+    Unicode character '’' ('\8217') looks like ''' (Single Quote), but it is not
diff --git a/testsuite/tests/parser/should_fail/T21843e.stderr b/testsuite/tests/parser/should_fail/T21843e.stderr
index c39d573b877c4afac3cb26e7239e34b5408e3748..12877123e77cfc7ec4f323aa1c23bddc2acddf95 100644
--- a/testsuite/tests/parser/should_fail/T21843e.stderr
+++ b/testsuite/tests/parser/should_fail/T21843e.stderr
@@ -1,3 +1,3 @@
 
 T21843e.hs:3:15: [GHC-31623]
-    Unicode character '”' ('/8221') looks like '"' (Quotation Mark), but it is not
+    Unicode character '”' ('\8221') looks like '"' (Quotation Mark), but it is not
diff --git a/testsuite/tests/parser/should_fail/T21843f.stderr b/testsuite/tests/parser/should_fail/T21843f.stderr
index 198917937a5494cc989735c15fa66256c56d59a6..6cd989f67900db61f37a0ab0b70d8396f5872f30 100644
--- a/testsuite/tests/parser/should_fail/T21843f.stderr
+++ b/testsuite/tests/parser/should_fail/T21843f.stderr
@@ -1,3 +1,3 @@
 
 T21843f.hs:3:13: [GHC-31623]
-    Unicode character '‘' ('/8216') looks like ''' (Single Quote), but it is not
+    Unicode character '‘' ('\8216') looks like ''' (Single Quote), but it is not