From d326c7298ac6804dba9264624c9df920c084d6a0 Mon Sep 17 00:00:00 2001 From: Vladislav Shchapov Date: Tue, 30 Jul 2024 19:27:11 +0500 Subject: [PATCH] Fix conversion a surrogate pair (#4095) Signed-off-by: Vladislav Shchapov --- include/fmt/format.h | 4 +++- test/std-test.cc | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/include/fmt/format.h b/include/fmt/format.h index 708c9051334e..98896bb7c517 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -1418,10 +1418,12 @@ template class to_utf8 { if (policy == to_utf8_error_policy::abort) return false; buf.append(string_view("\xEF\xBF\xBD")); --p; + continue; } else { c = (c << 10) + static_cast(*p) - 0x35fdc00; } - } else if (c < 0x80) { + } + if (c < 0x80) { buf.push_back(static_cast(c)); } else if (c < 0x800) { buf.push_back(static_cast(0xc0 | (c >> 6))); diff --git a/test/std-test.cc b/test/std-test.cc index 1327fe8279fd..bcc7bd5f655d 100644 --- a/test/std-test.cc +++ b/test/std-test.cc @@ -35,6 +35,9 @@ TEST(std_test, path) { L"\x0447\x044B\x043D\x0430")), "Шчучыншчына"); EXPECT_EQ(fmt::format("{}", path(L"\xd800")), "�"); + EXPECT_EQ(fmt::format("{}", path(L"HEAD \xd800 TAIL")), "HEAD � TAIL"); + EXPECT_EQ(fmt::format("{}", path(L"HEAD \xD83D\xDE00 TAIL")), "HEAD \xF0\x9F\x98\x80 TAIL"); + EXPECT_EQ(fmt::format("{}", path(L"HEAD \xD83D\xD83D\xDE00 TAIL")), "HEAD �\xF0\x9F\x98\x80 TAIL"); EXPECT_EQ(fmt::format("{:?}", path(L"\xd800")), "\"\\ud800\""); # endif }