我在项目中遇到需要生成一个Xml文件,通常Xml文件是以utf-8编码的,但VC一般是以“多字节”或unicode两种方式编译,也就是VC下的CString字符串一般是“多字节”或unicode中的一种。那么在生成文件时,需要将CString串转换为utf-8编码。下面为大家演示两种转换,以及生成文件的方法:
//============================unicode转utf-8==============================
//===============假设你的VC工程属性现在是设置为unicode编译方式==================
void Convert1()
{
CString XML;
XML = L"<?xml version=\"1.0\" encoding=\"UTF-8\"?><ExchangeInfo><ClipInfo><正题名>Test2</正题名></ClipInfo></ExchangeInfo>";
CFile file;
CFileException e;
if( !file.Open( PathWithoutExtOf(_T("D:\\测试"))+_T(".xml"),CFile::modeCreate|CFile::modeWrite, &e ) )
{
TRACE(_T("File could not be opened %d\n"), e.m_cause);
return ;
}
// CString strText;
//获取宽字节字符的大小,大小是按字节计算的
int nLength = WideCharToMultiByte(CP_UTF8, 0, XML, XML.GetLength(), NULL, 0, NULL, NULL);
//为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小
char *buf = new char[nLength+1]; //以字节为单位
//宽字节编码转换成多字节编码
WideCharToMultiByte(CP_UTF8, 0, XML, XML.GetLength(), buf, nLength, NULL, NULL);
buf[nLength] = '\0'; //多字节字符以'\0'结束
int ret = -13;
TRY{
file.Write( buf, nLength );
ret = 0;
}
CATCH_ALL(e)
{
e->ReportError();
}END_CATCH_ALL
XML.ReleaseBuffer();
delete[] buf;
}
//============================多字节转utf-8==============================
//===============假设你的VC工程属性现在是设置为多字节编译方式==================
void Convert2()
{
CString XML;
XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ExchangeInfo><ClipInfo><正题名>Test2</正题名></ClipInfo></ExchangeInfo>";
CFile file;
CFileException e;
if( !file.Open( PathWithoutExtOf(_T("D:\\测试"))+_T(".xml"),CFile::modeCreate|CFile::modeWrite, &e ) )
{
TRACE(_T("File could not be opened %d\n"), e.m_cause);
return ;
}
int len = XML.GetLength();
//多字节转成UTF8
int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)XML, len*sizeof(TCHAR), NULL, 0);
wchar_t* lpWideCharStr = new wchar_t[nSize+1];
memset(lpWideCharStr, 0, (nSize+1)*sizeof(wchar_t));
nSize = MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)XML, len*sizeof(wchar_t), lpWideCharStr, nSize);
nSize =WideCharToMultiByte(CP_UTF8 ,0,lpWideCharStr,-1,NULL,0,NULL,NULL);
char* buf = new char[nSize+1];
memset(buf, 0, nSize+1);
int newSize = WideCharToMultiByte(CP_UTF8 ,0,lpWideCharStr,-1,buf,nSize,NULL,NULL);
TRY{
file.Write( buf, nSize-1 );
}
CATCH_ALL(e)
{
e->ReportError();
}END_CATCH_ALL
XML.ReleaseBuffer();
delete[] buf;
}
//==============End=====================我在项目中这样写的,生成的XML文件正确。但是上述代码中有一点我不是很清楚,细心的读者应该看到,在file.Write( buf, nSize-1 );这句话的第二个参数,前后两种转换并不一样,前面在unicode转utf-8时不用减1,而后面在多字节转utf-8时,需要减1,即少写一个字节,不然生成的XML文件不正确,不能在IE上显示,这个问题曾经让我调试了半天,希望其他人注意,若有高手知道其中原因请告诉我。