Как я могу отправить ICU UnicodeString с помощью вызова boost :: asio: write? - PullRequest
2 голосов
/ 10 мая 2011

В настоящее время я использую библиотеку ICU для обработки данных Unicode и пытаюсь отправить UnicodeString через сокет.В настоящее время рассматривается пример использования базового сервера времени:

Daytime.3 - асинхронный TCP-сервер дневного времени

boost::asio::async_write(socket_, boost::asio::buffer(message_),
    boost::bind(&tcp_connection::handle_write, shared_from_this(),
    boost::asio::placeholders::error,
    boost::asio::placeholders::bytes_transferred)
);

Теперь я просмотрел различные функцииподписи и похоже, что boost::asio::buffer может занять boost::asio::const_buffer, но я не уверен, как конвертация в него работает, учитывая UnicodeString.Как мне перейти на const_buffer, или есть другой способ сделать это?Спасибо заранее за все ответы.

1 Ответ

3 голосов
/ 10 мая 2011

Если вы хотите отправить данные, используя внутреннюю кодировку UnicodeString по умолчанию (вместо форсирования, например, UTF-8 или UTF-32), тогда должно работать следующее:

// given UnicodeString ustr
boost::asio::const_buffer(ustr.getBuffer(), ustr.length() * sizeof(UChar));

См. UnicodeString :: getBuffer () и UnicodeString :: length () для получения дополнительной информации.

РЕДАКТИРОВАТЬ (в ответ на комментарий): чтобы отправить нормализованные данные UTF-32, попробуйте что-то вроде этого (добавив обработку ошибок и увеличив срок жизни объекта по мере необходимости):

UErrorCode err = U_ZERO_ERROR;
int32_t const size = ustr.toUTF32(0, 0, err);
err = U_ZERO_ERROR;
std::vector<UChar32> databuf(size);
ustr.toUTF32(&databuf[0], size, err);
boost::asio::const_buffer(&databuf[0], databuf.size() * sizeof(UChar32));
...