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 }