次のコードを使用して、テキスト エディター (メモ帳 ++) で作成したテキスト (.xml) ファイルから読み取り、そこから読み取った UTF-8 テキストを UTF-16 に変換して、Windows API 関数が使用できるようにします。 、次にこの UTF-16 でエンコードされたテキストを 2 番目のファイルに書き戻します。
私の問題は、出力ファイルを Notepad++ で開いたときに、テキスト エディターにどのエンコーディングを使用するように要求しても、期待どおりの結果が得られないことです。ファイル内のほぼすべての文字の前にヌル文字があります。出力ファイルに UTF-16 を書き込んでいるときに何か間違ったことをしたか、Notepad++ が 1 バイト文字として読み取っていると思います。
何かアイデアはありますか?コードは次のとおりです。
#define UNICODE
// includes...
int main( int argc, char * argv[] )
{
FILE * pzInFile,
* pzOutFile;
try
{
char sUtf8[8192];
char * pcDst = sUtf8;
wchar_t wsUtf16[8192];
_wfopen_s( & pzInFile, L"../config-sample.xml", L"r" );
_wfopen_s( & pzOutFile, L"../config-sample2.xml", L"w+" );
if( pzInFile && pzOutFile )
{
size_t uiRead;
while( uiRead = fread_s( pcDst, sizeof( sUtf8 ), 1, 1, pzInFile ) )
{
pcDst += uiRead;
}
size_t uiLen = pcDst - sUtf8;
sUtf8[uiLen] = 0;
MultiByteToWideChar( CP_UTF8, 0, sUtf8, 8192, wsUtf16, 8192 ); // UTF-8 to UTF-16
fwrite( wsUtf16, 1, uiLen, pzOutFile );
}
else
{
throw L"Failed to open file";
}
}
catch( const wchar_t * pwsMsg )
{
::MessageBox( NULL, pwsMsg, L"Error", MB_OK | MB_TOPMOST | MB_SETFOREGROUND );
}
if( pzInFile )
{
fclose( pzInFile );
pzInFile = 0;
}
if( pzOutFile )
{
fclose( pzOutFile );
pzOutFile = 0;
}
return 0;
}