const wchar_t * T_WCHAR byte T_U_CHAR INPUT T_WCHAR // $var = ($type)SvPV_nolen($arg) { Newz(0, $var, SvLEN($arg), wchar_t); U8* src = (U8*) SvPV_nolen($arg); wchar_t* dst = (wchar_t*) $var; if (SvUTF8($arg)) { STRLEN len; while (*src) { *dst++ = utf8_to_uvuni((U8*) src, &len); //*dst++ = uvchr_to_urf8() src += len; } } else { while (*src) { *dst++ = (wchar_t) *src++; } } *dst = 0; SAVEFREEPV($var); } T_U_CHAR $var = (unsigned char)SvUV($arg) OUTPUT T_WCHAR //sv_setpv((SV*)$arg, $var); { wchar_t* src = (wchar_t*) $var; U8* dst; U8* d; Newz(0, dst, 3 * wcslen(src), U8); d = dst; while (*src) { d = uvuni_to_utf8(d, *src++); } *d = 0; sv_setpv((SV*)$arg, (char*) dst); sv_utf8_decode($arg); Safefree(dst); } T_U_CHAR sv_setuv($arg, (UV)$var);