1. 程式人生 > >CMakeup解析中文亂碼及不同版本的區別

CMakeup解析中文亂碼及不同版本的區別

有空再來細說,先貼個程式碼佔位置
#include <iostream>
#include <string>
#include <cstdlib>
#include <tchar.h>
#include <stdio.h>
#include <Windows.h>
/////////////////////////////////////////////////////
//desc:
//測試檔案:test.xml,檔案編碼格式:utf-8
//舊版本:CMarkupSTL7.1,新版本:CMarkup:11.5
//開啟 預定義 OLD_MARKUP_VERSION ,xml的解析使用舊的CMarkupSTL
//註釋掉該行,則xml的解析使用新的CMarkup
//並且可以通過更改專案屬性中的字符集,來確定該如何解析
/////////////////////////////////////////////////////
#define OLD_MARKUP_VERSION 1

#ifdef OLD_MARKUP_VERSION 
#include "markupstl.h"
#define  CMarkup CMarkupSTL
#else
#include "Markup.h"
#endif

int main(void)
{
	CMarkup m_MarkupSTL;

#if (defined(MARKUP_WCHAR)   && ! defined(OLD_MARKUP_VERSION) )

	std::cout << "UNICODE MODEL" << std::endl;

	if(!m_MarkupSTL.Load(_T("test.xml"))) 
	{
		std::cout<<"the path error!";
		return false;
	}

	m_MarkupSTL.ResetPos();

	while ( m_MarkupSTL.FindChildElem(_T("pp_data")))
	{
		std::wstring docId=m_MarkupSTL.GetChildAttrib(_T("id"));
		//docId=atoi(m_MarkupSTL.GetChildAttrib("id").c_str());
		std::wcout<<"movie id:"<< docId << std::endl;
		m_MarkupSTL.IntoElem();                ///attention here!
		if(m_MarkupSTL.FindChildElem(_T("url"))) //欄位讀取順序和xml檔案要一致
		{
			std::wstring url=m_MarkupSTL.GetChildData();
			if(url.empty() || url[0]=='\0')
				url = _T("12345");
			std::wcout << L"url :" << url << std::endl;
		}

		

		m_MarkupSTL.FindChildElem(_T("img"));
		std::wcout << m_MarkupSTL.GetChildData() << std::endl;

		//
		char ctf[1000];

		m_MarkupSTL.FindChildElem(_T("name"));
		std::wstring name = m_MarkupSTL.GetChildData();

		WideCharToMultiByte( CP_ACP, 0, name.c_str(), -1, ctf, 1000, NULL, NULL );
		std::cout << "name :" << ctf << std::endl;
		//std::wcout << name << std::endl;

		m_MarkupSTL.FindChildElem(_T("desc"));
		std::wstring desc = m_MarkupSTL.GetChildData();
		
		WideCharToMultiByte( CP_ACP, 0, desc.c_str(), -1, ctf, 1000, NULL, NULL );
		std::cout << "decs :" << ctf << std::endl;
		
		//std::wcout << desc << std::endl;
		//wprintf(L"%s\n",desc.c_str());
		
		m_MarkupSTL.OutOfElem();
	}
	
#else //ANSI
#ifdef OLD_MARKUP_VERSION
	std::cout << "old markup " << std::endl;
#else
	std::cout << "ANSI MODLE" << std::endl;
#endif

	const char* src_file = "test.xml";
#ifdef OLD_MARKUP_VERSION
	int MAX_LEN=102400;
	WCHAR wfilebuf [102400] = L"";
	char filebuf[102400] = "";
	FILE*fp = fopen(src_file,"r");
	fseek(fp,0,SEEK_END);
	int nbytes = ftell(fp);
	fseek(fp,0,SEEK_SET);
	fread(filebuf,nbytes,1,fp);
	fclose(fp);
	

	MultiByteToWideChar(CP_UTF8,0,filebuf,-1,wfilebuf,MAX_LEN);
	WideCharToMultiByte(CP_ACP,0,wfilebuf,-1,filebuf,MAX_LEN,NULL,NULL);
	
	m_MarkupSTL.SetDoc(filebuf);
#else	
	
	if(!m_MarkupSTL.Load(src_file)){
		std::cout << "load error" << std::endl;
		return false;
	}
#endif
	m_MarkupSTL.ResetPos();

	while(m_MarkupSTL.FindChildElem("pp_data")){
		std::string id = m_MarkupSTL.GetChildAttrib("id");
		std::cout << "movie id:" << id << std::endl;

		m_MarkupSTL.IntoElem();

		m_MarkupSTL.FindChildElem("url");
		std::string url = m_MarkupSTL.GetChildData();
		std::cout << "url :" << url << std::endl;

		m_MarkupSTL.FindChildElem("img");
		std::string img = m_MarkupSTL.GetChildData();
		std::cout << "img :" << img << std::endl;

		m_MarkupSTL.FindChildElem("name");
		std::string name = m_MarkupSTL.GetChildData();
		std::cout << "name :" << name << std::endl;;

		m_MarkupSTL.FindChildElem("desc");
		std::string desc = m_MarkupSTL.GetChildData();
		std::cout << "desc :" << desc << std::endl;

		m_MarkupSTL.OutOfElem();
	}

#endif
	std::system("PAUSE");
}