From bc4f1b8f8e36bb9cd2b70714f6c53b8f5b59dce7 Mon Sep 17 00:00:00 2001 From: Patrick Chin Date: Thu, 16 Oct 2025 02:26:57 +0800 Subject: [PATCH 1/2] Fix missing escape character lookup for forward slash (solidus). --- src/ser.rs | 4 +++- tests/test.rs | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ser.rs b/src/ser.rs index 50c06f938..2eeff0911 100644 --- a/src/ser.rs +++ b/src/ser.rs @@ -2115,6 +2115,7 @@ where self::FF => CharEscape::FormFeed, self::RR => CharEscape::CarriageReturn, self::QU => CharEscape::Quote, + self::FS => CharEscape::Solidus, self::BS => CharEscape::ReverseSolidus, self::UU => CharEscape::AsciiControl(byte), // Safety: the escape table does not contain any other type of character. @@ -2138,6 +2139,7 @@ const NN: u8 = b'n'; // \x0A const FF: u8 = b'f'; // \x0C const RR: u8 = b'r'; // \x0D const QU: u8 = b'"'; // \x22 +const FS: u8 = b'/'; // \x2F const BS: u8 = b'\\'; // \x5C const UU: u8 = b'u'; // \x00...\x1F except the ones above const __: u8 = 0; @@ -2148,7 +2150,7 @@ static ESCAPE: [u8; 256] = [ // 1 2 3 4 5 6 7 8 9 A B C D E F UU, UU, UU, UU, UU, UU, UU, UU, BB, TT, NN, UU, FF, RR, UU, UU, // 0 UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, // 1 - __, __, QU, __, __, __, __, __, __, __, __, __, __, __, __, __, // 2 + __, __, QU, __, __, __, __, __, __, __, __, __, __, __, __, FS, // 2 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 3 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 4 __, __, __, __, __, __, __, __, __, __, __, __, BS, __, __, __, // 5 diff --git a/tests/test.rs b/tests/test.rs index f608679e6..fa64e3c0b 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -203,7 +203,7 @@ fn test_write_char() { ('n', "\"n\""), ('"', "\"\\\"\""), ('\\', "\"\\\\\""), - ('/', "\"/\""), + ('/', "\"\\/\""), ('\x08', "\"\\b\""), ('\x0C', "\"\\f\""), ('\n', "\"\\n\""), From c4e2b4ede7deba23e3bd01172942ba2b9b1c0c4f Mon Sep 17 00:00:00 2001 From: Patrick Chin Date: Thu, 16 Oct 2025 18:49:46 +0800 Subject: [PATCH 2/2] Preserve the default behavior of not escaping solidus. --- src/ser.rs | 1 + tests/test.rs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ser.rs b/src/ser.rs index 2eeff0911..10b479447 100644 --- a/src/ser.rs +++ b/src/ser.rs @@ -1794,6 +1794,7 @@ pub trait Formatter { ]; writer.write_all(bytes) } + Solidus => writer.write_all(&[escape_char]), _ => writer.write_all(&[b'\\', escape_char]), } } diff --git a/tests/test.rs b/tests/test.rs index fa64e3c0b..f608679e6 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -203,7 +203,7 @@ fn test_write_char() { ('n', "\"n\""), ('"', "\"\\\"\""), ('\\', "\"\\\\\""), - ('/', "\"\\/\""), + ('/', "\"/\""), ('\x08', "\"\\b\""), ('\x0C', "\"\\f\""), ('\n', "\"\\n\""),