linux string 转wstring

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

猜你喜欢

转载自konin.iteye.com/blog/2336688