2011-11-28 4 views
3

У меня есть следующий код в ANSII:повышение :: ASIO :: написать UNICODE

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?

+3

Ваш код просто использует широкий символ _type_. Это (в основном) ортогонально с символом _encodings _... – ildjarn

ответ

3

Вам необходимо знать, в какую кодировку поступают ваши данные.

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

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

+0

Если я получу Unicode в UTF-8, я не потеряю ни одного из символов? Если нет, есть ли преимущество использования функций wI/O? – Takashi

+0

@ Takashi-kun Если вы работаете с UTF-8, нет преимуществ использовать широкие версии символов и множество недостатков. UTF-8 - это 8-разрядная кодировка. –

1

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

Так, например, это то, что я сделал для чтения файла юникода и передач над 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)); 

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

Смежные вопросы