(转) C++ Utf8字符转换Gb312编码,解决TinyXml中文乱码

时间:2022-12-31 14:16:07

原文地址:http://cjmxp007.blog.163.com/blog/static/35473837201061541933667/

 

  1  #ifndef TRANSFORM
  2  #define  TRANSFORM
  3  #include  < map >
  4  using   namespace  std;
  5  //  是否启用map转换,建议启用
  6  //  使用map转换的话,同一个常量字符串不会做两次转换
  7  #define  TEST_TYPE_MAP
  8 
  9  typedef map < const   char * const   char *>  strmap;
 10 
 11  class  CUtf8String
 12  {
 13       public :
 14          inline CUtf8String( const   char *  gb2312)
 15          {
 16              m_bIsConst  =   true ;
 17  #ifdef TEST_TYPE_MAP
 18               if  (m[gb2312])
 19              {
 20                  m_utf8  =  m[gb2312];
 21                   return  ;
 22              }
 23  #endif
 24               int  buffLen  =   0 ;
 25              WCHAR wbuff[ 5120 ];
 26              MultiByteToWideChar(CP_ACP,  0 , gb2312,  - 1 , wbuff,  5120 );
 27              buffLen  =  WideCharToMultiByte(CP_UTF8,  0 , wbuff,  - 1 , NULL,  0 0 0 );
 28              m_utf8  =   new   char [buffLen + 1 ];
 29              WideCharToMultiByte(CP_UTF8,  0 , wbuff,  - 1 , (LPSTR)m_utf8, buffLen,  0 0 );
 30  #ifdef TEST_TYPE_MAP
 31              m[gb2312]  =  m_utf8;
 32  #endif
 33          }
 34 
 35          inline CUtf8String( char *  gb2312)
 36          {
 37              m_bIsConst  =   false ;
 38               int  buffLen  =   0 ;
 39              WCHAR wbuff[ 5120 ];
 40              MultiByteToWideChar(CP_ACP,  0 , gb2312,  - 1 , wbuff,  5120 );
 41              buffLen  =  WideCharToMultiByte(CP_UTF8,  0 , wbuff,  - 1 , NULL,  0 0 0 );
 42              m_utf8  =   new   char [buffLen + 1 ];
 43              WideCharToMultiByte(CP_UTF8,  0 , wbuff,  - 1 , (LPSTR)m_utf8, buffLen,  0 0 );
 44          }
 45 
 46          inline  ~ CUtf8String()
 47              {
 48  #ifndef TEST_TYPE_MAP
 49               if  (m_utf8)
 50              {
 51                  delete m_utf8;
 52                  m_utf8  =   0 ;
 53              }
 54  #else
 55               if  ( ! m_bIsConst)
 56                  {
 57                   if  (m_utf8)
 58                      {
 59                      delete m_utf8;
 60                      m_utf8  =   0 ;
 61                      }
 62                  }
 63  #endif
 64              }
 65 
 66          inline  operator   char * ()
 67              {
 68               return  ( char * )m_utf8;
 69              }
 70       private :
 71           const   char *  m_utf8;
 72           bool  m_bIsConst;
 73  #ifdef TEST_TYPE_MAP
 74           static  strmap m;
 75  #endif
 76  };
 77 
 78  class  CGb2312String
 79      {
 80       public :
 81          inline CGb2312String( const   char *  utf8)
 82              {
 83  #ifdef TEST_TYPE_MAP
 84               if  (m[utf8])
 85              {
 86                  m_gb2312  =   0 ;
 87                  m_gb2312  =  m[utf8];
 88              }
 89  #endif
 90               int  buffLen  =   0 ;
 91              WCHAR wbuff[ 5120 ];
 92              MultiByteToWideChar(CP_UTF8,  0 , utf8,  - 1 , wbuff,  5120 );
 93              buffLen  =  WideCharToMultiByte(CP_ACP,  0 , wbuff,  - 1 , NULL,  0 0 0 );
 94              m_gb2312  =   new   char [buffLen + 1 ];
 95              WideCharToMultiByte(CP_ACP,  0 , wbuff,  - 1 , (LPSTR)m_gb2312, buffLen,  0 0 );
 96  #ifdef TEST_TYPE_MAP
 97              m[utf8]  =  m_gb2312;
 98  #endif
 99          }
100 
101          inline CGb2312String( char *  utf8)
102          {
103  #ifdef TEST_TYPE_MAP
104               if  (m[utf8])
105              {
106                  m_gb2312  =   0 ;
107                  m_gb2312  =  m[utf8];
108              }
109  #endif
110               int  buffLen  =   0 ;
111              WCHAR wbuff[ 5120 ];
112              MultiByteToWideChar(CP_UTF8,  0 , utf8,  - 1 , wbuff,  5120 );
113              buffLen  =  WideCharToMultiByte(CP_ACP,  0 , wbuff,  - 1 , NULL,  0 0 0 );
114              m_gb2312  =   new   char [buffLen + 1 ];
115              WideCharToMultiByte(CP_ACP,  0 , wbuff,  - 1 , (LPSTR)m_gb2312, buffLen,  0 0 );
116  #ifdef TEST_TYPE_MAP
117              m[utf8]  =  m_gb2312;
118  #endif
119          }
120 
121          inline  ~ CGb2312String()
122          {
123  #ifndef TEST_TYPE_MAP
124               if  (m_gb2312)
125                  {
126                  delete m_gb2312;
127                  m_gb2312  =   0 ;
128                  }
129  #endif
130          }
131 
132          inline  operator   char * ()
133          {
134               return  ( char * )m_gb2312;
135          }
136       private :
137           const   char *  m_gb2312;
138  #ifdef TEST_TYPE_MAP
139           static  strmap m;
140  #endif
141  };
142 
143  #ifdef TEST_TYPE_MAP
144  strmap CUtf8String::m;
145  strmap CGb2312String::m;
146  #endif
147  #endif
148 
149 
150  // ===================无聊的分割线==========================
151 
152  #define  U   (CUtf8String)
153 
154  #define  W   (CGb2312String)
155 
156  //  使用方法
157  int  main( int  argc,  char *  argv[])
158  {
159       //  打印出乱码即为UTF8的编码,方便吧。C++还是确实很强悍的
160      printf( " %s " , U " 你好中国! " );
161  }