我在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;
}

解决方案 »

  1.   

    lz的编码转换正确吗?UTF-8与GB2312之间的互换
    http://www.vckbase.com/document/viewdoc/?id=1444要是从文件载入直接load()好了
      

  2.   

    十分感谢,问题已经解决……
    因为XML的数据是在程序运行时在内存中组装出来的,所以只能用LoadXML加载……,也正因为是组装出来的数据,忘了在最后加上0的结束符……。
    所以一开始失败后查MSDN说只支持UTF-8的编码就进行了转码……,没想到转出来的可以装了却奇怪的出现了乱码。(非常奇怪的问题……)
    其实直接使用CString的AllocSysString就可以了,不需要使用特别的转换的。