我正在使用以下代码从我在文本编辑器(Notepad++)中创建的文本(.xml)文件中读取,将我从中读取的 UTF-8 文本转换为 UTF-16,以便 Windows API 函数可以使用它,然后将此 UTF-16 编码文本写回第二个文件。
我的问题是,当我在 Notepad++ 中打开输出文件时,无论我要求文本编辑器使用什么编码,我都没有得到我期望看到的内容。文件中几乎每个字符之前都有空字符。我假设在将 UTF-16 写入输出文件时我做错了什么,或者 Notepad++ 正在读取为单字节字符。
请问有什么想法吗?这是代码:
#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;
}