コード例 #1
0
ファイル: FXUTF16Codec.cpp プロジェクト: Eric-Dang/AIShare
// 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;
  }
コード例 #2
0
ファイル: FXTextCodec.cpp プロジェクト: gfphoenix/tsiu
// 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;
  }
コード例 #3
0
ファイル: FXTextCodec.cpp プロジェクト: gfphoenix/tsiu
// 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);
  }