Хорошо ли / безопасно / можно использовать крошечную библиотеку 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." );
}
}