如何使用boost :: asio:write调用发送ICU UnicodeString?

时间:2011-05-10 15:48:46

标签: c++ boost unicode boost-asio icu

我目前正在使用ICU库来处理Unicode数据,我正在尝试通过套接字发送UnicodeString。目前正在使用基本时间服务器查看示例:

Daytime.3 - An asynchronous TCP daytime server

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,但我不确定如果{{1}转换到它是如何工作的}}。我应该如何转换为UnicodeString,还是我应该采取另一种方式来做这件事?提前感谢所有回复。

1 个答案:

答案 0 :(得分:3)

假设您要使用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));