- inline bool UTF2UNICODE(const char* src, CString &t)
-
{
-
if (src == NULL)
-
{
-
ASSERT(FALSE);
-
return false;
-
}
-
-
int size_s = (int)strlen(src);
-
int size_d = size_s + 10; //?
-
-
wchar_t *des = new wchar_t[size_d];
-
memset(des, 0, size_d * sizeof(wchar_t));
-
-
int s = 0, d = 0;
-
bool toomuchbyte = true; //set true to skip error prefix.
-
-
while (s < size_s && d < size_d)
-
{
-
unsigned char c = src[s];
-
if ((c & 0x80) == 0)
-
{
-
des[d++] += src[s++];
-
}
-
else if((c & 0xE0) == 0xC0) ///< 110x-xxxx 10xx-xxxx
-
{
-
WCHAR &wideChar = des[d++];
-
wideChar = (src[s + 0] & 0x3F) << 6;
-
wideChar |= (src[s + 1] & 0x3F);
-
-
s += 2;
-
}
-
else if((c & 0xF0) == 0xE0) ///< 1110-xxxx 10xx-xxxx 10xx-xxxx
-
{
-
WCHAR &wideChar = des[d++];
-
-
wideChar = (src[s + 0] & 0x1F) << 12;
-
wideChar |= (src[s + 1] & 0x3F) << 6;
-
wideChar |= (src[s + 2] & 0x3F);
-
-
s += 3;
-
}
-
else if((c & 0xF8) == 0xF0) ///< 1111-0xxx 10xx-xxxx 10xx-xxxx 10xx-xxxx
-
{
-
WCHAR &wideChar = des[d++];
-
-
wideChar = (src[s + 0] & 0x0F) << 18;
-
wideChar = (src[s + 1] & 0x3F) << 12;
-
wideChar |= (src[s + 2] & 0x3F) << 6;
-
wideChar |= (src[s + 3] & 0x3F);
-
-
s += 4;
-
}
-
else
-
{
-
WCHAR &wideChar = des[d++]; ///< 1111-10xx 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx
-
-
wideChar = (src[s + 0] & 0x07) << 24;
-
wideChar = (src[s + 1] & 0x3F) << 18;
-
wideChar = (src[s + 2] & 0x3F) << 12;
-
wideChar |= (src[s + 3] & 0x3F) << 6;
-
wideChar |= (src[s + 4] & 0x3F);
-
-
s += 5;
-
}
-
}
-
-
t = des;
-
delete[] des;
-
des = NULL;
-
-
return true;
- }