From d79b9f6ab6c4a93f93dd4b38c170a5f4da8111af Mon Sep 17 00:00:00 2001 From: Sylwester Lachiewicz Date: Sat, 14 Nov 2026 13:50:55 +0100 Subject: [PATCH] [Go] Escape control characters as \u00XX in generated flyweight JSON strings. GetAsJsonEscapedString wrote control characters with %x, which dropped the escape and lost the value. --- .../src/baseline/JsonEscapedString_test.go | 32 +++++++++++++++++++ .../flyweight/GolangFlyweightGenerator.java | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 gocode/flyweight/src/baseline/JsonEscapedString_test.go diff --git a/gocode/flyweight/src/baseline/JsonEscapedString_test.go b/gocode/flyweight/src/baseline/JsonEscapedString_test.go new file mode 100644 index 0000000000..26bbd9a551 --- /dev/null +++ b/gocode/flyweight/src/baseline/JsonEscapedString_test.go @@ -0,0 +1,32 @@ +package baseline + +import ( + "encoding/json" + "testing" +) + +func TestJsonEscapedStringEscapesControlCharacters(t *testing.T) { + var data [256]byte + var in Car + in.WrapForEncode(data[:], 0, uint64(len(data))) + in.FuelFiguresCount(0) + in.PerformanceFiguresCount(0) + in.PutManufacturer("a\x01\"b\x1f"). + PutModel("Civic"). + PutActivationCode("x") + + var out Car + out.WrapForDecode(data[:], 0, uint64(in.SbeBlockLength()), uint64(in.SbeSchemaVersion()), uint64(len(data))) + out.FuelFigures() + out.PerformanceFigures() + + escaped := out.GetManufacturerAsJsonEscapedString() + if escaped != `a\u0001\"b\u001f` { + t.Fatalf("unexpected escaped string: %s", escaped) + } + + var decoded string + if err := json.Unmarshal([]byte(`"`+escaped+`"`), &decoded); err != nil || decoded != "a\x01\"b\x1f" { + t.Fatalf("escaped string does not round trip through JSON: %q, %v", decoded, err) + } +} diff --git a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/golang/flyweight/GolangFlyweightGenerator.java b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/golang/flyweight/GolangFlyweightGenerator.java index 8fa84c80c6..8ef66078c8 100644 --- a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/golang/flyweight/GolangFlyweightGenerator.java +++ b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/golang/flyweight/GolangFlyweightGenerator.java @@ -1970,7 +1970,7 @@ private void generateJsonEscapedStringGetter( indent + "\t\t\toss.WriteString(\"\\\\t\")\n\n" + indent + "\t\tdefault:\n" + indent + "\t\t\tif '\\x00' <= c && c <= '\\x1f' {\n" + - indent + "\t\t\t\tfmt.Fprintf(&oss, \"%%x\", c)\n" + + indent + "\t\t\t\tfmt.Fprintf(&oss, \"\\\\u%%04x\", c)\n" + indent + "\t\t\t} else {\n" + indent + "\t\t\t\toss.WriteString(string(c))\n" + indent + "\t\t\t}\n" +