小さなutfcppライブラリを使用して、ワイドWindows API(FindFirstFileWなど)から取得したすべてのものをutf16to8を使用して有効なUTF8表現に変換するのは良い/安全/可能ですか?
内部でUTF8を使用したいのですが、正しい出力を取得できません(別の変換後のwcoutまたはプレーンcoutを介して)。もちろん通常のASCII文字は機能しますが、ñäはめちゃくちゃになります。
または、より簡単な代替手段はありますか?
ありがとう!
更新:Hans(下記)のおかげで、WindowsAPIを介してUTF8<->UTF16を簡単に変換できるようになりました。双方向変換は機能しますが、UTF16文字列からのUTF8には余分な文字がいくつかあり、後で問題が発生する可能性があります...)。純粋な親しみやすさからここで共有します:)):
// 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." );
}
}