zoukankan      html  css  js  c++  java
  • (转) C++ Utf8字符转换Gb312编码,解决TinyXml中文乱码

    原文地址: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, 000);
     28             m_utf8 = new char[buffLen+1];
     29             WideCharToMultiByte(CP_UTF8, 0, wbuff, -1, (LPSTR)m_utf8, buffLen, 00);
     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, 000);
     42             m_utf8 = new char[buffLen+1];
     43             WideCharToMultiByte(CP_UTF8, 0, wbuff, -1, (LPSTR)m_utf8, buffLen, 00);
     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, 000);
     94             m_gb2312 = new char[buffLen+1];
     95             WideCharToMultiByte(CP_ACP, 0, wbuff, -1, (LPSTR)m_gb2312, buffLen, 00);
     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, 000);
    114             m_gb2312 = new char[buffLen+1];
    115             WideCharToMultiByte(CP_ACP, 0, wbuff, -1, (LPSTR)m_gb2312, buffLen, 00);
    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 }
  • 相关阅读:
    【题解】【LOJ2102】「TJOI2015」弦论
    【学习笔记】后缀自动机复习
    【博客介绍】笔者的自我介绍/博客简介
    【题解】【CodeForces653F】Ants on a Circle
    带修莫队
    [BZOJ3832]Rally(线段树+拓扑排序)
    [CTSC2010]星际旅行(带反悔的贪心)
    [TJOI2011]书架
    CF1204E Natasha, Sasha and the Prefix Sums
    [CSP校内集训]ginkgo(树上启发式合并/逆序对)
  • 原文地址:https://www.cnblogs.com/format/p/1832436.html
Copyright © 2011-2022 走看看