【发布时间】:2013-09-11 19:11:31
【问题描述】:
我正在使用以下代码读取我在文本编辑器 (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;
}
【问题讨论】:
-
听起来 Notepad++ 实际上并没有“理解”UTF-16 字符(或者没有正确“检测”它)。
标签: c++ c windows file unicode