这段代码是从网上找的。但是,在实际使用中,出现了很多莫名奇妙的问题。后来多了修改,经过大规模的测试,表现良好。首先,感谢原作者,由于找不到链接了,不好意思,没能贴出链接地址。 size_t Dictionary::get_wchar_size(const char *str) { size_t len = strlen(str); size_t size=0; size_t i; for(i=0; i < len; i++) { if( str[i] >= 0 && str[i] <= 127 ) //不是全角字符 { size+=sizeof(wchar_t); } else //是全角字符,是中文 { size+=sizeof(wchar_t); i+=2; } } return size; } char * Dictionary::w2c(const wchar_t *pw) { if(!pw) { return NULL; } size_t size= wcslen(pw)*sizeof(wchar_t); char *pc; if(!(pc = (char*)malloc(size))) { printf("malloc fail"); return NULL; } wcstombs(pc,pw,size); return pc; } wchar_t * Dictionary::c2w(const char *pc) { if(!pc) { return NULL; } size_t size_of_ch = strlen(pc)*sizeof(char); size_t size_of_wc = get_wchar_size(pc); wchar_t *pw; if(!(pw = (wchar_t*)malloc(size_of_wc))) { printf("malloc fail"); return NULL; } mbstowcs(pw,pc,size_of_wc); return pw; } std::wstring Dictionary::c2w_1(const char *pc) { std::wstring val = L""; /*if(!pc) { return NULL; } */ if(NULL == pc) { return val; } size_t size_of_ch = strlen(pc)*sizeof(char); size_t size_of_wc = get_wchar_size(pc); //size_t size_of_wc; //assert(size_of_wc = get_wchar_size(pc)); if(size_of_wc == 0) { return val; } wchar_t * pw = new wchar_t[size_of_wc]; mbstowcs(pw,pc,size_of_wc); val = pw; delete pw; return val; }