wstring s2ws(const string &s,_locale_t locale) { wstring result; if(!locale) { return result; } const size_t len = s.size()+1; wchar_t *dest = new wchar_t[len]; size_t numOfCharConverted = 0; errno_t err = _mbstowcs_s_l(&numOfCharConverted,dest,len,s.c_str(),_TRUNCATE,locale); if(err == 0) { result = dest; } else if(err == STRUNCATE) { OutputDebugStringA("UniCore s2ws 目标缓冲区不足,字符串被截断。"); result = dest; } else { OutputDebugStringA("UniCore s2ws 转换MBCS字符串到Unicode字符串时失败。"); } delete []dest; return result; }
wstring s2ws(const string &s,const char *locale /*= ""*/) { assert(locale); wstring result; _locale_t loc = _create_locale(LC_CTYPE,locale); //使用指定的locale。 //如果_create_locale返回空,返回空字符串。 if(!loc) { return result; } const size_t len = s.size()+1; wchar_t *dest = new wchar_t[len]; size_t numOfCharConverted = 0; errno_t err = _mbstowcs_s_l(&numOfCharConverted,dest,len,s.c_str(),_TRUNCATE,loc); _free_locale(loc); if(err == 0) { result = dest; } else if(err == STRUNCATE) { assert(!"dest buffer should be adequate"); result = dest; } else { //转换失败。 } delete []dest; return result; }
std::wstring convert(const char* m, _locale_t l) { wchar_t msg[1024]; size_t s = 0; _mbstowcs_s_l(&s, msg, 1024, m, _TRUNCATE, l); return msg; }
// callback to get result static void callback_result_final(Recog *recog, void *data) { cJulius *j = (cJulius *)data; int i; WORD_INFO *winfo; WORD_ID *seq; int seqnum; Sentence *s; RecogProcess *r; static char str[2048]; static wchar_t wstr[2048]; size_t size = 0; WPARAM wparam = 0; _locale_t locale; unsigned int code; r = j->getRecog()->process_list; if (! r->live) return; if (r->result.status < 0) { /* no results obtained */ switch(r->result.status) { case J_RESULT_STATUS_REJECT_POWER: strcpy(str, "<input rejected by power>"); break; case J_RESULT_STATUS_TERMINATE: strcpy(str, "<input teminated by request>"); break; case J_RESULT_STATUS_ONLY_SILENCE: strcpy(str, "<input rejected by decoder (silence input result)>"); break; case J_RESULT_STATUS_REJECT_GMM: strcpy(str, "<input rejected by GMM>"); break; case J_RESULT_STATUS_REJECT_SHORT: strcpy(str, "<input rejected by short input>"); break; case J_RESULT_STATUS_FAIL: strcpy(str, "<search failed>"); break; } code = (- r->result.status); } else { winfo = r->lm->winfo; s = &(r->result.sent[0]); seq = s->word; seqnum = s->word_num; str[0] = '\0'; for(i=0;i<seqnum;i++) strcat(str, winfo->woutput[seq[i]]); code = 0; } // convert to wide char //mbstowcs_s( &size, wstr, str, strlen(str)+1); locale = j->getModelLocale(); if (locale) _mbstowcs_s_l( &size, wstr, str, strlen(str)+1, locale); else mbstowcs_s( &size, wstr, str, strlen(str)+1); // set status parameter wparam = (code << 16) + JEVENT_RESULT_FINAL; // send message PostMessage(j->getWindow(), WM_JULIUS, wparam, (LPARAM)wstr); }