// Convert multi-byte characters from src to utf8 characters at dst FXint FXUTF16Codec::mb2utf(FXchar* dst,FXint ndst,const FXchar* src,FXint nsrc) const { const FXint SURROGATE_OFFSET=0x10000-(0xD800<<10)-0xDC00; register FXint nw,len=0; FXwchar w,v; if(dst && src && 0<nsrc){ if(nsrc<2) return -2; w=(((FXuchar)src[0])<<8)|((FXuchar)src[1]); if(w!=0xFFFE){ // Big-endian (default) if(w==0xFEFF){ src+=2; nsrc-=2; } while(0<nsrc){ if(nsrc<2) return -2; w=(((FXuchar)src[0])<<8)|((FXuchar)src[1]); src+=2; nsrc-=2; if(0xD800<=w && w<0xDC00){ if(nsrc<2) return -2; v=(((FXuchar)src[0])<<8)|((FXuchar)src[1]); if(v<0xDC00 || 0xE000<=v) return 0; w=(w<<10)+v+SURROGATE_OFFSET; src+=2; nsrc-=2; } nw=wc2utf(dst,ndst,w); if(nw<=0) return nw; len+=nw; dst+=nw; ndst-=nw; } } else{ // Little-endian src+=2; nsrc-=2; while(0<nsrc){ if(nsrc<2) return -2; w=(((FXuchar)src[1])<<8)|((FXuchar)src[0]); src+=2; nsrc-=2; if(0xD800<=w && w<0xDC00){ if(nsrc<2) return -2; v=(((FXuchar)src[1])<<8)|((FXuchar)src[0]); if(v<0xDC00 || 0xE000<=v) return 0; w=(w<<10)+v+SURROGATE_OFFSET; src+=2; nsrc-=2; } nw=wc2utf(dst,ndst,w); if(nw<=0) return nw; len+=nw; dst+=nw; ndst-=nw; } } } return len; }
// Convert multi-byte characters from src to utf8 characters at dst FXint FXTextCodec::mb2utf(FXchar* dst,FXint ndst,const FXchar* src,FXint nsrc) const { register FXint nr,nw,len=0; FXwchar w; if(dst && src && 0<nsrc){ do{ nr=mb2wc(w,src,nsrc); if(nr<=0) return nr; src+=nr; nsrc-=nr; nw=wc2utf(dst,ndst,w); if(nw<=0) return nw; len+=nw; dst+=nw; ndst-=nw; } while(0<nsrc); } return len; }
// Convert single wide character to multi-byte characters at dst FXint FXTextCodec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { return wc2utf(dst,ndst,wc); }