forked from lix-project/lix
filterANSIEscapes(): Handle UTF-8 characters
This commit is contained in:
parent
0d6419ad87
commit
ef84c780bb
|
@ -587,4 +587,14 @@ namespace nix {
|
||||||
|
|
||||||
ASSERT_EQ(filterANSIEscapes(s, true), "foo bar baz" );
|
ASSERT_EQ(filterANSIEscapes(s, true), "foo bar baz" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(filterANSIEscapes, utf8) {
|
||||||
|
ASSERT_EQ(filterANSIEscapes("foobar", true, 5), "fooba");
|
||||||
|
ASSERT_EQ(filterANSIEscapes("fóóbär", true, 6), "fóóbär");
|
||||||
|
ASSERT_EQ(filterANSIEscapes("fóóbär", true, 5), "fóóbä");
|
||||||
|
ASSERT_EQ(filterANSIEscapes("fóóbär", true, 3), "fóó");
|
||||||
|
ASSERT_EQ(filterANSIEscapes("f€€bär", true, 4), "f€€b");
|
||||||
|
ASSERT_EQ(filterANSIEscapes("f𐍈𐍈bär", true, 4), "f𐍈𐍈b");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1409,7 +1409,28 @@ std::string filterANSIEscapes(const std::string & s, bool filterAll, unsigned in
|
||||||
i++;
|
i++;
|
||||||
|
|
||||||
else {
|
else {
|
||||||
t += *i++; w++;
|
w++;
|
||||||
|
// Copy one UTF-8 character.
|
||||||
|
if ((*i & 0xe0) == 0xc0) {
|
||||||
|
t += *i++;
|
||||||
|
if (i != s.end() && ((*i & 0xc0) == 0x80)) t += *i++;
|
||||||
|
} else if ((*i & 0xf0) == 0xe0) {
|
||||||
|
t += *i++;
|
||||||
|
if (i != s.end() && ((*i & 0xc0) == 0x80)) {
|
||||||
|
t += *i++;
|
||||||
|
if (i != s.end() && ((*i & 0xc0) == 0x80)) t += *i++;
|
||||||
|
}
|
||||||
|
} else if ((*i & 0xf8) == 0xf0) {
|
||||||
|
t += *i++;
|
||||||
|
if (i != s.end() && ((*i & 0xc0) == 0x80)) {
|
||||||
|
t += *i++;
|
||||||
|
if (i != s.end() && ((*i & 0xc0) == 0x80)) {
|
||||||
|
t += *i++;
|
||||||
|
if (i != s.end() && ((*i & 0xc0) == 0x80)) t += *i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
t += *i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue