2

UnicodeString現在、ICUライブラリを使用してUnicodeデータを処理しており、ソケットを介して送信しようとしています。現在、基本的なタイムサーバーを使用した例を見てみましょう。

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 に答える