Ошибка парсинга emoji в XML

154
26 ноября 2018, 11:40

Есть следующий код по замене emoji:

message = message.replace(":)", u8"\U0001F601");

В qt отображается все хорошо. Показывается картинка с emoji. Далее сообщение отправляется на сервер для хранения и тут возникают проблемы. Работа с сервером идет через библиотеку boost. Перед тем как попасть на сервер сообщение перекодируется:

std::wstring newmsg= message.toStdWString().c_str();
std::string msg = boost::to_utf8(newmsg);

Далее msg загоняется в XML и отправляется на сервер. И XML выдает ошикбку парсинга.

Так же пробовался вариант:

auto a = message.toUtf8().replace(":)", u8"\U0001F601");
addMessage(QString::fromUtf8(a));

и

message = message.replace(":)", QString::fromUtf8(u8"\U0001F601"));

Что можно сделать?

P.S. Система Win 10. Сообщение проходит проверку на escape симфолы.

Answer 1

UPD: https://github.com/boostorg/spirit/issues/395

Я не уверен, что ошибка именно здесь, но обратите внимание:

boost::to_utf8(newmsg),

где newmsg имеет тип std::wstring

А вот та самая ф-ия из Boost'a:

template <typename Char, typename Traits, typename Allocator>
        inline utf8_string 
        to_utf8(std::basic_string<Char, Traits, Allocator> const& str)
        {
            // always store as UTF8
            utf8_string result;
            typedef std::back_insert_iterator<utf8_string> insert_iter;
            insert_iter out_iter(result);
            utf8_output_iterator<insert_iter> utf8_iter(out_iter);
            typedef typename make_unsigned<Char>::type UChar;
            BOOST_FOREACH(Char ch, str)
            {
                *utf8_iter++ = (UChar)ch;
            }
            return result;
        }

Где utf8_string - это std::string.

Так вот, меня смущает вот эта строка:

*utf8_iter++ = (UChar)ch;

За utf8_iter прячется char, а справа - wchar_t (причем какой-то производный тип, т.к. использовался make_unsigned.

READ ALSO
Как работает &ldquo;Vertex Array Object&rdquo; в openGL?

Как работает “Vertex Array Object” в openGL?

Я так понимаю, VAO - это просто обертка над конкретным VBO? Те

172
Как изменить регистр i-ой буквы в c++

Как изменить регистр i-ой буквы в c++

нужно изменить символ s[0] на букву следующего регистра

185
Обертывание С++ структуры для python

Обертывание С++ структуры для python

товарищиПрошу помочь советом или указать верный путь

184