boost :: asio :: написать UNICODE - PullRequest
       18

boost :: asio :: написать UNICODE

3 голосов
/ 29 ноября 2011

У меня есть следующий код в ANSII:

boost::asio::streambuf buffer;
std::ostream oss(&buffer);

boost::asio::async_write(socket_, buffer,
    strand_.wrap(
    boost::bind(&Connection::handleWrite, shared_from_this(),
    boost::asio::placeholders::error)));

Мне нужно преобразовать его в UNICODE. Я попробовал следующее:

boost::asio::basic_streambuf<std::allocator<wchar_t>> buffer; 
std::wostream oss(&buffer); 

boost::asio::async_write(socket_, buffer,
    strand_.wrap(
    boost::bind(&Connection::handleWrite, shared_from_this(),
    boost::asio::placeholders::error)));

Есть ли способ использовать async_write () в UNICODE?

Ответы [ 2 ]

3 голосов
/ 29 ноября 2011

Вы должны знать, какова кодировка ваших данных.

Например, в моих приложениях я знаю, что данные Юникода поступают как UTF-8, и поэтому я использую обычные char версии функций. Затем мне нужно обработать буферы как данные Unicode UTF-8 - но все получено / отправлено ОК.

Если вы используете другую кодировку символов, вы можете (или не можете) получить лучший пробег, используя версию с широкими символами, как вы пытались.

1 голос
/ 29 ноября 2011

Я не совсем на всех вызовах, которые вы делаете здесь (недавно только глубоко проник в asio), но я знаю, что вы можете просто обрабатывать данные с вектором очень просто.

Так, например, вот что я сделал для чтения файла Unicode и передачи через сокет posix:

// Open the file
std::ifstream is(filename, std::ios::binary);

std::vector<wchar_t> buffer;

// Get the file byte length
long start = is.tellg();
is.seekg(0, std::ios::end);
long end = is.tellg();
is.seekg(0, std::ios::beg);

// Resize the vector to the file length
buffer.resize((end-start)/sizeof(wchar_t));
is.read((char*)&buffer[0], end-start);

// Write the vector to the pipe
boost::asio::async_write(output, boost::asio::buffer(buffer),
                         boost::bind(&FileToPipe::handleWrite, this));

Звонок на boost :: asio :: buffer (vector) документирован здесь: http://www.boost.org/doc/libs/1_40_0/doc/html/boost_asio/reference/buffer/overload17.html

...