Sint32 str2wstr(PCSTR utf8, PWSTR unicode, Sint32 size)
{
int i = 0, u = 0;
SGL_MEMSET(unicode, 0, size);
while(utf8[i] && u < size - 2)
{
if((utf8[i] & 0x80) == 0)
{
// one byte 0...
unicode[u+1] = utf8[i++];
}else if((utf8[i] & 0x20) == 0){
// two bytes 110... 10...
unicode[u] = (UCHAR)((utf8[i]) & 0x1f) >> 2;
unicode[u+1] = ((UCHAR)((utf8[i]) & 0x1f) << 6) | (utf8[i+1] & 0x3f);
i+=2;
}else{
// three bytes 1110... 10... 10...
unicode[u] = ((utf8[i] & 0x0f) << 4) | ((utf8[i+1] & 0x3f) >> 2);
unicode[u+1] = (((utf8[i+1] & 0x3f) << 6)) | (utf8[i+2] & 0x3f);
i+=3;
}
u+=2;
}
return u;
}
Sint32 wstr2str(PCWSTR unicode, PSTR utf8, Sint32 size)
{
int u = 0, i = 0;
SGL_MEMSET(utf8, 0, size);
while((unicode[u] || unicode[u+1]) && i < size-1)
{
if(unicode[u] == 0 && unicode[u+1] < 128)
{
// 0 - 7 bits
utf8[i++] = unicode[u+1];
}else if((unicode[u] & 0xf8) == 0){
// 8 - 11 bits
utf8[i++] = 0xc0 | (unicode[u] << 2) | (unicode[u+1] >> 6);
utf8[i++] = 0x80 | (unicode[u+1] & 0x3f);
}else{
// 12 - 16 bits
utf8[i++] = 0xe0 | (unicode[u] >> 4);
utf8[i++] = 0x80 | ((unicode[u] & 0x0f) << 2) | (unicode[u+1] >> 6);
utf8[i++] = 0x80 | (unicode[u+1] & 0x3f);
}
u+=2;
}
return i;
}