2

我目前正在使用 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,或者我应该以其他方式进行此操作?提前感谢您的所有回复。

4

1 回答 1

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));
于 2011-05-10T16:01:09.743 回答