diff --git a/src/autotests/CharacterWidthTest.cpp b/autotests/CharacterWidthTest.cpp --- a/src/autotests/CharacterWidthTest.cpp +++ b/autotests/CharacterWidthTest.cpp @@ -58,6 +58,8 @@ QTest::newRow("0xFF5F") << uint(0xFF5F) << 2; QTest::newRow("0xFF60") << uint(0xFF60) << 2; QTest::newRow("0xFFe0") << uint(0xFFe6) << 2; + QTest::newRow("🥄") << uint(0x1F944) << 2; + QTest::newRow("🥃") << uint(0x1F943) << 2; } void CharacterWidthTest::testWidth() diff --git a/src/konsole_wcwidth.cpp b/konsole_wcwidth.cpp --- a/src/konsole_wcwidth.cpp +++ b/konsole_wcwidth.cpp @@ -76,6 +76,8 @@ // Qt #include +#include + struct interval { unsigned long first; unsigned long last; @@ -193,11 +195,6 @@ return 0; } - /* Always assume double width, otherwise we have to go back and move characters */ - if (QChar::isHighSurrogate(ucs)) { - return 2; - } - if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0)) { return -1; } @@ -207,23 +204,9 @@ sizeof(combining) / sizeof(struct interval) - 1) != 0) { return 0; } - /* if we arrive here, ucs is not a combining or C0/C1 control character */ + return wcwidth(ucs); - return 1 + - static_cast(ucs >= 0x1100 && - (ucs <= 0x115f || /* Hangul Jamo init. consonants */ - ucs == 0x2329 || ucs == 0x232a || - (ucs >= 0x2e80 && ucs <= 0xa4cf && - ucs != 0x303f) || /* CJK ... Yi */ - (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */ - (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */ - (ucs >= 0xfe10 && ucs <= 0xfe19) || /* Vertical forms */ - (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */ - (ucs >= 0xff00 && ucs <= 0xff60) || /* Fullwidth Forms */ - (ucs >= 0xffe0 && ucs <= 0xffe6) || - (ucs >= 0x20000 && ucs <= 0x2fffd) || - (ucs >= 0x30000 && ucs <= 0x3fffd))); } int string_width(const QString& text)