Получилось удалить символы. Суть в том, что Qt почему-то не воспринимает симол, если пытаться удалить или заменить его, обращаясь, как
U0001F9B7
, даже, если символ там точно присутствует и выводится в таком формате в консоль, через
qDebug()
.
Для удаления симолов эмодзи, необходимо воспользоваться статическим методом
QString::fromWCharArray()
- куда передать сурогатные пары
(как раз те, ккоторые видны в отладчике как
55358(0xd83e) и
56759 (0xdbd7) - в моем случае, для данного эмодзи).
Метод будет выглядеть так:
QString::fromWCharArray(L"\xD83E\xDDB7");
и, он как это не странно вернет ту же строку -
U0001F9B7
, но вот ее, почему-то, Qt уже прекрасно удаляет:
QString tmpStr=QString::fromWCharArray(L"\xD83E\xDDB7");
myStr.remove(tmpStr);
В поисках ответа мне помогли:
Эта тема на английском SO:
https://stackoverflow.com/questions/30247319/how-d...
(Не уверен, можно ли на тостере оставлять ссылки на другие форумы, поэтому, вот цитата ответа:
You already know the answer - specify it as a proper UTF-16 string.
Unicode codepoints above U+FFFF are represented in UTF-16 using a surrogate pair, which is two 16bit codeunits acting together to represent the full Unicode codepoint value. For U+1F50E, the surrogate pair is U+D83D U+DD0E.
In Qt, a UTF-16 codeunit is represented as a QChar, so you need two QChar values, eg:
edit.setText(QString::fromWCharArray(L"\xD83D\xDD0E"));
or:
edit.setText(QString::fromStdWString(L"\xD83D\xDD0E"));
Assuming a platform where sizeof(wchar_t) is 2 and not 4.
In your example, you tried using QString::fromUtf8(), but you gave it an invalid UTF-8 string. For U+1F50E
, it should have looked like this instead:
edit.setText(QString::fromUtf8("\xF0\x9F\x94\x8E"));
You can also use QString::fromUcs4()
instead:
uint cp = 0x1F50E; edit.setText(QString::fromUcs4(&cp, 1));
)
Данный калькулятор для вычисления юникода по суррогатным парам и наоборот:
www.russellcottrell.com/greek/utilities/SurrogateP...