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
}