Если в main опустить вызов setlocale в любом из вариантов, то вызов mbstowcs возвращает -1 на первом кириллическом символе. Если же setlocale вызван, то все работает корректно.
wchar_t* convert_from_UCS2(char* mess, size_t len){
iconv_t ids = iconv_open("utf-8", "UCS-2");
if( ids ==(iconv_t) -1 )
return 0;
wchar_t* message = (wchar_t*) malloc(MESS_MAX_LEN*sizeof(wchar_t));
char rs[MESS_MAX_LEN];
size_t out = sizeof(rs);
memset(rs, 0, out);
char* rsp = rs;
if( iconv(ids, &mess, &len, &rsp, &out ) == -1 ){
free( message );
iconv_close(ids);
return 0;
}
iconv_close(ids);
if ( mbstowcs(message, rs, MESS_MAX_LEN) == -1 ){
free( message );
return 0;
}
return message;
}
int main(int argc, char** argv) {
if (setlocale(LC_ALL, "") == 0) return -1;
//if (setlocale(LC_ALL, "ru_RU.UTF-8") == 0) return -1;
char* syms="\x61\xf1\x98\x5c\x36\x9f\xd1\0";
char* syms_ucs="\x55\x00\x6e\x00\x69\x00\x63\x00\x6f\x00\x64\x00\x65\x00\x20\x00\x20\x00\x4d\x04\x42\x04\x3e\x04";
//char* syms_ucs="\x1f\x04";
wchar_t* result = convert_from_GSM(syms);
assert(result != 0);
wprintf(L"%ls\n", result);
free (result);
result = convert_from_UCS2(syms_ucs, 24);
assert(result != 0);
wprintf(L"%ls\n", result);
free (result);
return (EXIT_SUCCESS);
}