boolUnicode::stringToWstring(conststring&s, wstring&t) { t.reserve(t.length() +s.length()); wchar_twc; unsignedintminval; unsignedcharc; string::size_typelen; for (string::size_typei=0;i<s.length();i+=len) { c=s[i]; if(c<0x80) { wc=c; len=1; minval=0; }elseif (c<0xC0) {// 10xxxxxx returnfalse; }elseif (c<0xE0) {// 110xxxxx wc=c&0x1F; len=2; minval=0x80; }elseif(c<0xF0) {// 1110xxxx wc=c&0xF; len=3; minval=0x800; #ifSIZEOF_WCHAR_T>=4 }elseif(c<0xF8) {// 11110xxx wc=c&7; len=4; minval=0x10000; }elseif(c<0xFC) {// 111110xx wc=c&3; len=5; minval=0x110000; }elseif(c<0xFE) {// 1111110x wc=c&1; len=6; minval=0x4000000; #endif }else{ returnfalse; } if(i+len-1<s.length()) { for(string::size_typej=1;j<len;++j) { if((s[i+j]&0xC0) !=0x80) { returnfalse; } wc<<=6; wc|=s[i+j]&0x3f; } if(static_cast<unsignedint>(wc) <minval) { returnfalse; }else{ t+=wc; } }else{ returnfalse; } } returntrue; }
中间用到了一个宏 SIZEOF_WCHAR_T,参考其声明
#ifdefined(_WIN32) #defineSIZEOF_WCHAR_T2 #elif (defined(__sun) &&defined(__sparc)) || \ ((defined(__linux) ||defined(__FreeBSD__)) && (defined(__i386) ||defined(__x86_64))) #defineSIZEOF_WCHAR_T4 #endif