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

发布于 2024-11-06 09:17:24 字数 692 浏览 4 评论 0原文

我目前正在使用 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,或者是否有其他方法可以做到这一点?提前感谢您的所有回复。

I'm currently using the ICU library to handle Unicode data, and am trying to send a UnicodeString over a socket. Currently looking at the example using a basic time server:

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)
);

Now, I've looked over various function signatures and it looks as though boost::asio::buffer can take a boost::asio::const_buffer, but I'm not sure on how the conversion to it works given a UnicodeString. How should I go about converting to const_buffer, or is there another way I should be going about doing this? Thank you ahead of time for all responses.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

佞臣 2024-11-13 09:17:24

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

Assuming you want to send the data using UnicodeString's default internal encoding (instead of forcing e.g. UTF-8 or UTF-32), then the following should work:

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

See UnicodeString::getBuffer() and UnicodeString::length() for more information.

EDIT (in response to comment): To send normalized UTF-32 data, try something like this (adding error handling and extending object lifetime as necessary):

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));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文