return 1;
065
}
066
067
if( b < 0xC0 || b > 0xFD )
068
{ // 非法UTF8
069
return 0;
070
}
071
072
if( b < 0xE0 )
073
{
074
dwUCS4 = b & 0x1F;
075
iLen = 2;
076
}
077
else if( b < 0xF0 )
078
{
079
dwUCS4 = b & 0x0F;
080
iLen = 3;
081
}
082
else if( b < 0xF8 )
083
{
084
dwUCS4 = b & 7;
085
iLen = 4;
086
}
087
else if( b < 0xFC )
088
{
089
dwUCS4 = b & 3;
090
iLen = 5;
091
}
092
else
093
{
094
dwUCS4 = b & 1;
095
iLen = 6;
096
}
097
098
for( i = 1; i < iLen; i++ )
099
{
100
b = *pbUTF8++;
101
if( b < 0x80 || b > 0xBF )
102
{ // 非法UTF8
103
break;
104
}
105
106
dwUCS4 = (dwUCS4 << 6) + (b & 0x3F);
107
}
108
109
if( i < iLen )
110
{ // 非法UTF8
111
return 0;
112
}
113
else
114
{
115
return iLen;
116
}
117
}
118
119
// 转换UCS4编码到UCS2编码
120
INT CUnicodeConverter::UCS4_To_UTF16( DWORD dwUCS4, WORD* pwUTF16 )
121
{
122
if( dwUCS4 <= 0xFFFF )
123
{
124
if( pwUTF16 != NULL )
125
{
126
*pwUTF16 = static_cast
127
}
128
129
return 1;
130
}
131
else if( dwUCS4 <= 0xEFFFF )
132
{
133
if( pwUTF16 != NULL )
134
{
135
pwUTF16[0] = static_cast
136
pwUTF16[1] = static_cast
137
}
138
139
return 2;
140
}
141
else
142
{
143
return 0;
144
}
145
}
146
147
// 转换UCS2编码到UCS4编码
148
INT CUnicodeConverter::UTF16_To_UCS4( const WORD* pwUTF16, DWORD& dwUCS4 )
149
{
150
WORD w1, w2;
151
if( pwUTF16 == NULL )
153
{ // 参数错误
154
return 0;
155
}
156
157
w1 = pwUTF16[0];
158
if( w1 >= 0xD800 && w1 <= 0xDFFF )
159
{ // 编码在替代区域(Surrogate Area)
160
if( w1 < 0xDC00 )
161
{
162
w2 = pwUTF16[1];
163
if( w2 >= 0xDC00 && w2 <= 0xDFFF )
164
{
165
dwUCS4 = (w2 & 0x03FF) + (((w1 & 0x03FF) + 0x40) << 10);
166
return 2;
167
}
168
}
169
170
return 0; // 非法UTF16编码
171
}
172
else
173
{
174
dwUCS4 = w1;
175
return 1;
176
}
177
}
178
179
// 转换UTF8字符串到UTF16字符串
180
INT CUnicodeConverter::UTF8Str_To_UTF16Str( const BYTE* pbszUTF8Str, WORD* pwszUTF16Str )
181
{
182
INT iNum, iLen;
183
DWORD dwUCS4;
184
185
if( pbszUTF8Str == NULL )
186
{ // 参数错误
187
return 0;
188
}
189
190
iNum = 0; // 统计有效字符个数
191
while( *pbszUTF8Str )
192
{ // UTF8编码转换为UCS4编码
193
iLen = UTF8_To_UCS4( pbszUTF8Str, dwUCS4 );
194
if( iLen == 0 )
195
{ // 非法的UTF8编码
196
return 0;
197
}
198
199
pbszUTF8Str += iLen;
200
201
// UCS4编码转换为UTF16编码
202
iLen = UCS4_To_UTF16( dwUCS4, pwszUTF16Str );
203
if( iLen == 0 )
204
{
205
return 0;
206
}
207
208
if( pwszUTF16Str != NULL )
209
{
210
pwszUTF16Str += iLen;
211
}
212
213
iNum += iLen;
214
}
215
216
if( pwszUTF16Str != NULL )
217
{
218
*pwszUTF16Str = 0; // 写入字符串结束标记
219
}
220
221
return iNum;
222
}
223
224
// 转换UTF16字符串到UTF8字符串
225
INT CUnicodeConverter::UTF16Str_To_UTF8Str( const WORD* pwszUTF16Str, BYTE* pbszUTF8Str )
226
{
227
INT iNum, iLen;
228
DWORD dwUCS4;
229
230
if( pwszUTF16Str == NULL )
231
{ // 参数错误
232
return 0;
233
}
234
235
iNum = 0;
236
while( *pwszUTF16Str )
237
{ // UTF16编码转换为UCS4编码
238
iLen = UTF16_To_UCS4( pwszUTF16Str, dwUCS4 );
239
if