TinyXML 解析中文XML

UTF-8 ---> unicode 转换目前UCS-2 的编码和unicode 的关系是:
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
例如“张”的unicode 是0x5F20,
对应的二进制是0101 1111 0010 0000B
,因为这个unicode的范围在0800 - FFFF 之间,
UTF-8 的编码就是:
1110 0101 1011 1100 1010 0000 0xE5BCA0 
           ----      ------              ----
            5          F     --    2  --   0
 大家应该知道怎么转了吧. 因为中文一般都在3个字节区,因此可以这样转换:
 int GetNo(char ch)
{    int i = 0;   
   while (ch & 0x80)  
 {        ++i;        ch <<= 1;    } 
  return i;
}

void UTF8ToUnicode(char *pUnicode, const char *pUtf8, int nBytes)
{    if (0 == nBytes) 
  {        *pUnicode = *pUtf8;    }
   if (nBytes == 3) 
  {     
  *pUnicode = (*pUtf8) & 0xf;  
     (*pUnicode) <<= 4;  
     pUtf8++;    
   char tt = (*pUtf8) & 0x3f; 
      char t = (tt >> 2) & 0xf;
       (*pUnicode) |= t;  
     char *W1 = pUnicode;  
    char W2 = *W1;   
    ++pUnicode;    
   *pUnicode = (tt & 0x3) << 6;   
    pUtf8++; 
      (*pUnicode ) |= (*pUtf8 & 0x3f);
       *W1 = *pUnicode;        *pUnicode = W2;     
      }  
 ++pUnicode;    *pUnicode = 0;
}


2 unicode 到GB2312 可以直接使用MS的API    WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(WCHAR),NULL,NULL); 
  下面是一个tinyXml 中的问题展示,这是一个测试的demo 程序,仅此参考。
// XMLTest.cpp : Defines the entry point for the console application.//
#include "stdafx.h"
#include "../Include/tinyxml.h"
#include "../Include/tinystr.h"
#include "Winnls.h"
#include <iostream>
#include <objbase.h>
#include <stdio.h>
using namespace std;
int GetNo(char ch)
{    int i = 0;    while (ch & 0x80)  
 {        ++i;        ch <<= 1;    }    return i;
}

void UTF8ToUnicode(char *pUnicode, const char *pUtf8, int nBytes)
{    if (0 == nBytes)    {        *pUnicode = *pUtf8;    }    if (nBytes == 3)    {        *pUnicode = (*pUtf8) & 0xf;        (*pUnicode) <<= 4;        pUtf8++;        char tt = (*pUtf8) & 0x3f;        char t = (tt >> 2) & 0xf;        (*pUnicode) |= t;        char *W1 = pUnicode;        char W2 = *W1;        ++pUnicode;        *pUnicode = (tt & 0x3) << 6;        pUtf8++;        (*pUnicode ) |= (*pUtf8 & 0x3f);        *W1 = *pUnicode;        *pUnicode = W2;            }    ++pUnicode;    *pUnicode = 0;}


void UnicodeToGB2312(char* pOut,unsigned short uData)
{  
 WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(WCHAR),NULL,NULL);    return;



  int main(int argc, char* argv[])
{    TiXmlDocument Document;  
  Document.LoadFile(("E://Sonix Works//XML//XML//f123.xml"), TIXML_ENCODING_UNKNOWN);
   TiXmlElement  *pRootElement = Document.RootElement (); 
  if (pRootElement != NULL ) 
 {        TiXmlElement *pFirst = pRootElement->FirstChildElement(); 
      cout << pFirst->Value()<<endl; 
      TiXmlElement *pFirstChild = pFirst->FirstChildElement(); 
      cout << pFirstChild->Value() << endl; 
      const char *  pFirstChildd = pFirstChild->Attribute("type");   
    char szbuff[300] ={0};  
     int nsize = GetNo(*pFirstChildd); 
      UTF8ToUnicode(szbuff, pFirstChildd, nsize);   
    LPCWSTR lpsz = (LPCWSTR)(szbuff);   
    wprintf( lpsz);      
 cout <<"TTTT" << endl; 
      char szbuff1[300] ={0};  
     UnicodeToGB2312(szbuff1, *lpsz);   
            cout << szbuff1 <<  endl;    
   char * GB2312 = "张";  
     cout << GB2312 <<endl;  
 }    return 0;
}


XML 文件如下:

<?xml version="1.0" encoding="GB2312"?>
<gf-config>
 <typedefs>  
 <typedef file="@this:TypeDef//BasicTypeDef.xml" type="张"/> 
  <typedef file="@this:TypeDef//ExtraTypeDef.xml" type="系统"/> 
  <typedef file="@this:TypeDef//AppTypeDef.xml" type="应用"/>
   <typedef file="@this:TypeDef//ManualTypeDef.xml" type="手动"/> 
</typedefs>
 <themes>        <theme file="@thistheme:Config//Theme.xml"/>
   </themes>  
 <configs>     
  <config file="@thistheme:Config//Config.xml"/>    
   <config file="@thistheme:Config//MainPanelConfig.xml"/> 
      <config file="@thistheme:Config//ChatFrameConfig.xml"/>  
     <config file="@thistheme:Config//MsgMgrConfig.xml"/>  
     <config file="@thistheme:Config//TaskTrayConfig.xml"/>
        <config file="@thistheme:Config//LoginPanelConfig.xml"/> 
      <config file="@thistheme:Config//ContactInfoFrameConfig.xml"/>   
    <config file="@thistheme:Config//AddGroupFrameConfig.xml"/> 
      <config file="@thistheme:Config//MainMenuFrameConfig.xml"/> 
      <config file="@thistheme:Config//ConfigCenterConfig.xml"/>   
    <config file="@thistheme:Config//ContactTipsConfig.xml"/>    
   <config file="@thistheme:Config//CustomFaceMgrConfig.xml"/> 
      <config file="@thistheme:Config//GroupSettingConfig.xml"/>  
 </configs>
</gf-config>

你可能感兴趣的:(xml,api,File,null,encoding,themes)