From 25de3c9c6823d333a0be904efb4776f30d60884f Mon Sep 17 00:00:00 2001 From: He-Pin Date: Wed, 24 Jun 2026 11:43:40 +0800 Subject: [PATCH 1/2] fix: std.manifestYamlDoc passes through Unicode characters natively MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Motivation: YamlRenderer hardcoded escapeUnicode = true, causing all non-ASCII characters to be escaped as \uXXXX sequences. Both C++ jsonnet and jrsonnet pass through Unicode characters directly in YAML output. Modification: - YamlRenderer.scala: Change escapeUnicode from true to false in both the key visitor (line 26) and value visitor (line 68). Result: std.manifestYamlDoc("世界") now outputs "世界" instead of "\u4e16\u754c", matching C++ jsonnet and jrsonnet. Cross-implementation comparison: | Expression | C++ jsonnet | sjsonnet (before) | sjsonnet (after) | |--------------------------------------|-------------|------------------------|-------------------| | std.manifestYamlDoc("世界") | "世界" | "\u4e16\u754c" ❌ | "世界" ✅ | | std.manifestYamlDoc("café") | "café" | "caf\u00e9" ❌ | "café" ✅ | | std.manifestYamlDoc("🌍") | "🌍" | "\ud83c\udf0d" ❌ | "🌍" ✅ | | std.manifestYamlDoc({name: "世界"}) | name: 世界 | name: \u4e16\u754c ❌ | name: 世界 ✅ | --- sjsonnet/src/sjsonnet/YamlRenderer.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sjsonnet/src/sjsonnet/YamlRenderer.scala b/sjsonnet/src/sjsonnet/YamlRenderer.scala index ade9f517c..a73516eaa 100644 --- a/sjsonnet/src/sjsonnet/YamlRenderer.scala +++ b/sjsonnet/src/sjsonnet/YamlRenderer.scala @@ -23,7 +23,7 @@ class YamlRenderer( null, YamlRenderer.this.elemBuilder, s, - escapeUnicode = true, + escapeUnicode = false, wrapQuotes = true ) } else { @@ -65,7 +65,7 @@ class YamlRenderer( null, elemBuilder, s, - escapeUnicode = true, + escapeUnicode = false, wrapQuotes = true ) } From cbb79c1405f0d042c040626a8c5b1246a192760b Mon Sep 17 00:00:00 2001 From: He-Pin Date: Wed, 24 Jun 2026 12:19:47 +0800 Subject: [PATCH 2/2] test: add YAML Unicode native output regression test (golden from C++ jsonnet) --- .../new_test_suite/yaml_unicode_native_output.jsonnet | 9 +++++++++ .../yaml_unicode_native_output.jsonnet.golden | 1 + 2 files changed, 10 insertions(+) create mode 100644 sjsonnet/test/resources/new_test_suite/yaml_unicode_native_output.jsonnet create mode 100644 sjsonnet/test/resources/new_test_suite/yaml_unicode_native_output.jsonnet.golden diff --git a/sjsonnet/test/resources/new_test_suite/yaml_unicode_native_output.jsonnet b/sjsonnet/test/resources/new_test_suite/yaml_unicode_native_output.jsonnet new file mode 100644 index 000000000..069e1a306 --- /dev/null +++ b/sjsonnet/test/resources/new_test_suite/yaml_unicode_native_output.jsonnet @@ -0,0 +1,9 @@ +// Regression test: YAML output must pass through Unicode natively. +// Golden verified against cpp-jsonnet 0.21.0, go-jsonnet 0.22.0, jrsonnet 0.5.0-pre99. +std.assertEqual(std.manifestYamlDoc("世界"), "\"世界\"") && +std.assertEqual(std.manifestYamlDoc("café"), "\"café\"") && +std.assertEqual(std.manifestYamlDoc({name: "世界", drink: "café"}), + "\"drink\": \"café\"\n\"name\": \"世界\"") && +std.assertEqual(std.manifestYamlDoc(["🌍", "世界", "café"]), + "- \"🌍\"\n- \"世界\"\n- \"café\"") && +true diff --git a/sjsonnet/test/resources/new_test_suite/yaml_unicode_native_output.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/yaml_unicode_native_output.jsonnet.golden new file mode 100644 index 000000000..27ba77dda --- /dev/null +++ b/sjsonnet/test/resources/new_test_suite/yaml_unicode_native_output.jsonnet.golden @@ -0,0 +1 @@ +true