From 371d8e2ee044181b5c3fe36658c6f991277a678a Mon Sep 17 00:00:00 2001 From: Victor Zverovich Date: Sun, 22 Aug 2021 07:38:22 -0700 Subject: [PATCH] Escape Unicode --- include/fmt/ranges.h | 8 +++++++- test/ranges-test.cc | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/include/fmt/ranges.h b/include/fmt/ranges.h index 8ee5a0ee..ab60f805 100644 --- a/include/fmt/ranges.h +++ b/include/fmt/ranges.h @@ -304,9 +304,15 @@ auto write_range_entry(OutputIt out, basic_string_view str) -> OutputIt { *out++ = '\\'; break; default: + if (is_utf8() && escape.cp > 0xffff) { + out = format_to(out, "\\U{:08x}", escape.cp); + continue; + } for (Char escape_char : basic_string_view( escape.begin, to_unsigned(escape.end - escape.begin))) { - out = format_to(out, "\\x{:02x}", escape_char); + out = format_to( + out, "\\x{:02x}", + static_cast::type>(escape_char)); } continue; } diff --git a/test/ranges-test.cc b/test/ranges-test.cc index 2d6ce814..1addbf5f 100644 --- a/test/ranges-test.cc +++ b/test/ranges-test.cc @@ -268,4 +268,10 @@ TEST(ranges_test, escape_string) { EXPECT_EQ(fmt::format("{}", vec{"\n\r\t\"\\"}), "[\"\\n\\r\\t\\\"\\\\\"]"); EXPECT_EQ(fmt::format("{}", vec{"\x07"}), "[\"\\x07\"]"); EXPECT_EQ(fmt::format("{}", vec{"\x7f"}), "[\"\\x7f\"]"); + + // Unassigned Unicode code points. + if (fmt::detail::is_utf8()) { + EXPECT_EQ(fmt::format("{}", vec{"\xf0\xaa\x9b\x9e"}), "[\"\\U0002a6de\"]"); + EXPECT_EQ(fmt::format("{}", vec{"\xf4\x8f\xbf\xbf"}), "[\"\\U0010ffff\"]"); + } }