diff --git a/include/fmt/format.h b/include/fmt/format.h index 29e0106a..8d3ed6f9 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -695,7 +695,28 @@ FMT_CONSTEXPR inline size_t compute_width(string_view s) { // It is not a lambda for compatibility with C++14. struct count_code_points { size_t* count; - FMT_CONSTEXPR void operator()(uint32_t, int) const { ++*count; } + FMT_CONSTEXPR void operator()(uint32_t cp, int error) const { + *count += + 1 + + (error == 0 && cp >= 0x1100 && + (cp <= 0x115f || // Hangul Jamo init. consonants + cp == 0x2329 || // LEFT-POINTING ANGLE BRACKET〈 + cp == 0x232a || // RIGHT-POINTING ANGLE BRACKET 〉 + // CJK ... Yi except Unicode Character “〿”: + (cp >= 0x2e80 && cp <= 0xa4cf && cp != 0x303f) || + (cp >= 0xac00 && cp <= 0xd7a3) || // Hangul Syllables + (cp >= 0xf900 && cp <= 0xfaff) || // CJK Compatibility Ideographs + (cp >= 0xfe10 && cp <= 0xfe19) || // Vertical Forms + (cp >= 0xfe30 && cp <= 0xfe6f) || // CJK Compatibility Forms + (cp >= 0xff00 && cp <= 0xff60) || // Fullwidth Forms + (cp >= 0xffe0 && cp <= 0xffe6) || // Fullwidth Forms + (cp >= 0x20000 && cp <= 0x2fffd) || // CJK + (cp >= 0x30000 && cp <= 0x3fffd) || + // Miscellaneous Symbols and Pictographs + Emoticons: + (cp >= 0x1f300 && cp <= 0x1f64f) || + // Supplemental Symbols and Pictographs: + (cp >= 0x1f900 && cp <= 0x1f9ff))); + } }; for_each_codepoint(s, count_code_points{&num_code_points}); return num_code_points; diff --git a/test/compile-test.cc b/test/compile-test.cc index df76f085..ae3534c5 100644 --- a/test/compile-test.cc +++ b/test/compile-test.cc @@ -253,7 +253,7 @@ TEST(CompileTimeFormattingTest, String) { test_format<17>(FMT_COMPILE("{} is {}"), "The answer", "42")); EXPECT_EQ("abc**", test_format<6>(FMT_COMPILE("{:*<5}"), "abc")); - EXPECT_EQ("**🤡**", test_format<9>(FMT_COMPILE("{:*^5}"), "🤡")); + EXPECT_EQ("**🤡**", test_format<9>(FMT_COMPILE("{:*^6}"), "🤡")); } TEST(CompileTimeFormattingTest, Combination) { diff --git a/test/format-test.cc b/test/format-test.cc index 470aafb8..34b4ca48 100644 --- a/test/format-test.cc +++ b/test/format-test.cc @@ -868,7 +868,8 @@ TEST(FormatterTest, Width) { EXPECT_EQ(" 0xcafe", format("{0:10}", reinterpret_cast(0xcafe))); EXPECT_EQ("x ", format("{0:11}", 'x')); EXPECT_EQ("str ", format("{0:12}", "str")); - EXPECT_EQ(format("{:*^5}", "🤡"), "**🤡**"); + EXPECT_EQ(format("{:*^6}", "🤡"), "**🤡**"); + EXPECT_EQ(format("{:*^8}", "你好"), "**你好**"); EXPECT_EQ(format("{:#6}", 42.0), " 42.0"); EXPECT_EQ(format("{:6c}", static_cast('x')), "x "); EXPECT_EQ(format("{:>06.0f}", 0.00884311), "000000");