VOID UCS2_TO_UTF8(char *dst, wchar_t *src) { wchar_t t; while (t = *src) { if (t <= 0x7F) { dst[0] = (t & 0x7F); dst += 1; src++; } else if (t <= 0x7FF) { dst[0] = (6 << 5) | (t >> 11); dst[1] = (2 << 6) | (t & 0x3F); dst += 2; src++; } else { dst[0] = (14 << 4) | (t >> 12); dst[1] = (2 << 6) | ((t >> 6) & 0x3F); dst[2] = (2 << 6) | (t & 0x3F); dst += 3; src++; } } *dst = '\0'; } VOID UTF8_TO_UCS2(wchar_t *dst, char *src) { char t; long n; while (t = *src) { n = 0; while (t & 0x80) { n++; t = t << 1; } switch (n) { case 0: { dst[0] = (src[0] & 0x7F); dst++; src += 1; } break; case 2: { dst[0] = ((src[0] & 0x1F) << 6) | (src[1] & 0x3F); dst++; src += 2; } break; case 3: { dst[0] = ((src[0] & 0x1F) << 12) | ((src[1] & 0x3F) << 6) | (src[2] & 0x3F); dst++; src += 3; } break; default: { *dst = L'\0'; return; } break; } } *dst = L'\0'; }