From e789611498c56f074447733083e3a629c4b2b947 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Sat, 30 May 2026 15:21:50 -0700 Subject: [PATCH] stringify: fix string escaping --- json.zig | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/json.zig b/json.zig index 3fbf3c4f36c4e4569eea5ca6fff6107780ed5a17..389502f90c45554d4d36516c1c48fb5c92dec61d 100644 --- a/json.zig +++ b/json.zig @@ -725,7 +725,19 @@ pub fn stringify(writer: anytype, value: anytype, options: std.json.StringifyOpt const T = @TypeOf(value); if (comptime extras.isZigString(T)) { if (extras.matchesAll(u8, value, std.ascii.isAscii)) { - try writer.writevAll(&.{ &.{'"'}, value, &.{'"'} }); + if (extras.matchesAll(u8, value, std.ascii.isPrint)) { + try writer.writevAll(&.{ &.{'"'}, value, &.{'"'} }); + } else { + try writer.writeAll("\""); + for (value) |c| { + try writer.writeAll(switch (c) { + 0x20...0x7e => &.{c}, + 0x0c => "\\n", + else => "\\u00" ++ extras.to_hex([_]u8{c}), + }); + } + try writer.writeAll("\""); + } } else { @panic("TODO"); } @@ -733,7 +745,19 @@ pub fn stringify(writer: anytype, value: anytype, options: std.json.StringifyOpt } if (comptime extras.isArrayOf(u8)(T)) { if (extras.matchesAll(u8, &value, std.ascii.isAscii)) { - try writer.writevAll(&.{ &.{'"'}, &value, &.{'"'} }); + if (extras.matchesAll(u8, value, std.ascii.isPrint)) { + try writer.writevAll(&.{ &.{'"'}, &value, &.{'"'} }); + } else { + try writer.writeAll("\""); + for (&value) |c| { + try writer.writeAll(switch (c) { + 0x20...0x7e => &.{c}, + 0x0c => "\\n", + else => "\\u00" ++ extras.to_hex([_]u8{c}), + }); + } + try writer.writeAll("\""); + } } else { @panic("TODO"); } -- 2.54.0