我在VC中把一个XML文件的内容读入内存,之后想使用LoadXML进行载,因为LOADXML只接受UTF-8编码的数据,于是我用MultiByteToWideChar 进行了转换,但是最后在取各个项的数据时,得到的全是乱码,我也试过用WideCharToMultiByte 进行转回,可还是不行。
请问,倒底是什么地方的问题呢?
以下是代码片断:用到的数据的定义:
IXMLDOMDocumentPtr pDoc;
IXMLDOMNodePtr pNode;bool Cxml::LoadFromBuffer(char* buffer)
{
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML::DOMDocument)); //创建文档对象
if (hr == S_OK)
{
VARIANT_BOOL bFlag;
//对STR 进行UTF-8转码
int len = static_cast<int>(strlen(buffer));
WCHAR* wbuffer = new WCHAR[len+2];
memset(wbuffer,0,sizeof(WCHAR)*len+2);
int rl = MultiByteToWideChar(CP_UTF8 , 0, buffer, len, wbuffer, len+2);
DWORD dw = GetLastError();
BSTR sb = wbuffer;
hr = pDoc->loadXML(sb, &bFlag); //load xml文件
delete[] wbuffer;
if (S_OK == hr)
{
return true; } }
return false;
}HRESULT Cxml::GetCurrentNodeText(CString NodeName,CString& outText)
{
if (pNode == NULL)
return E_FAIL;
IXMLDOMNodePtr pcNode = NULL;
CComBSTR name;
CComBSTR text;
name = NodeName;
HRESULT hr = pNode->selectSingleNode(name,&pcNode);
if (S_OK == hr)
{
hr = pcNode->get_text(&text);
if (S_OK == hr )
{
//SAFE_RELEASE(pcNode);
pcNode.Release();
//转换成可以用的数据。
char buffer[4096];
int rl = WideCharToMultiByte(CP_UTF8, 0,text, -1, buffer, 4096, NULL, NULL);
DWORD dw = GetLastError();
outText = buffer;
return hr;
}
}
pcNode.Release(); return E_FAIL;
}
请问,倒底是什么地方的问题呢?
以下是代码片断:用到的数据的定义:
IXMLDOMDocumentPtr pDoc;
IXMLDOMNodePtr pNode;bool Cxml::LoadFromBuffer(char* buffer)
{
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML::DOMDocument)); //创建文档对象
if (hr == S_OK)
{
VARIANT_BOOL bFlag;
//对STR 进行UTF-8转码
int len = static_cast<int>(strlen(buffer));
WCHAR* wbuffer = new WCHAR[len+2];
memset(wbuffer,0,sizeof(WCHAR)*len+2);
int rl = MultiByteToWideChar(CP_UTF8 , 0, buffer, len, wbuffer, len+2);
DWORD dw = GetLastError();
BSTR sb = wbuffer;
hr = pDoc->loadXML(sb, &bFlag); //load xml文件
delete[] wbuffer;
if (S_OK == hr)
{
return true; } }
return false;
}HRESULT Cxml::GetCurrentNodeText(CString NodeName,CString& outText)
{
if (pNode == NULL)
return E_FAIL;
IXMLDOMNodePtr pcNode = NULL;
CComBSTR name;
CComBSTR text;
name = NodeName;
HRESULT hr = pNode->selectSingleNode(name,&pcNode);
if (S_OK == hr)
{
hr = pcNode->get_text(&text);
if (S_OK == hr )
{
//SAFE_RELEASE(pcNode);
pcNode.Release();
//转换成可以用的数据。
char buffer[4096];
int rl = WideCharToMultiByte(CP_UTF8, 0,text, -1, buffer, 4096, NULL, NULL);
DWORD dw = GetLastError();
outText = buffer;
return hr;
}
}
pcNode.Release(); return E_FAIL;
}
http://www.vckbase.com/document/viewdoc/?id=1444要是从文件载入直接load()好了
因为XML的数据是在程序运行时在内存中组装出来的,所以只能用LoadXML加载……,也正因为是组装出来的数据,忘了在最后加上0的结束符……。
所以一开始失败后查MSDN说只支持UTF-8的编码就进行了转码……,没想到转出来的可以装了却奇怪的出现了乱码。(非常奇怪的问题……)
其实直接使用CString的AllocSysString就可以了,不需要使用特别的转换的。