多字节和Unicode转utf-8,并写成文件

我在项目中遇到需要生成一个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上显示,这个问题曾经让我调试了半天,希望其他人注意,若有高手知道其中原因请告诉我。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值