Хорошо/безопасно/возможно ли использовать крошечную библиотеку utfcpp для преобразования всего, что я получаю из широкой Windows API (FindFirstFileW и т. д.) для действительного представления UTF8 с использованием utf16to8?
Я хотел бы использовать UTF8 для внутреннего использования, но у меня возникли проблемы с получением правильного вывода (через wcout после другого преобразования или обычный cout). Обычные символы ASCII, конечно, работают, но ñä путается.
Или есть более легкая альтернатива?
Спасибо!
ОБНОВЛЕНИЕ: благодаря Гансу (ниже) теперь у меня есть простое преобразование UTF8‹->UTF16 через Windows API. Двустороннее преобразование работает, но в строке UTF8 из UTF16 есть несколько дополнительных символов, которые позже могут вызвать у меня некоторые проблемы...). Поделюсь здесь из чистого дружелюбия :) ):
// UTF16 -> UTF8 conversion
std::string toUTF8( const std::wstring &input )
{
// get length
int length = WideCharToMultiByte( CP_UTF8, NULL,
input.c_str(), input.size(),
NULL, 0,
NULL, NULL );
if( !(length > 0) )
return std::string();
else
{
std::string result;
result.resize( length );
if( WideCharToMultiByte( CP_UTF8, NULL,
input.c_str(), input.size(),
&result[0], result.size(),
NULL, NULL ) > 0 )
return result;
else
throw std::runtime_error( "Failure to execute toUTF8: conversion failed." );
}
}
// UTF8 -> UTF16 conversion
std::wstring toUTF16( const std::string &input )
{
// get length
int length = MultiByteToWideChar( CP_UTF8, NULL,
input.c_str(), input.size(),
NULL, 0 );
if( !(length > 0) )
return std::wstring();
else
{
std::wstring result;
result.resize( length );
if( MultiByteToWideChar(CP_UTF8, NULL,
input.c_str(), input.size(),
&result[0], result.size()) > 0 )
return result;
else
throw std::runtime_error( "Failure to execute toUTF16: conversion failed." );
}
}