zl程序教程

您现在的位置是:首页 >  后端

当前栏目

lib.utf.js

JS utf lib
2023-06-13 09:13:57 时间
/*UTF-8<=>UTF-16convertionlibrary.
 *
/*Copyright(C)1999MasanaoIzumo<iz@onicos.co.jp>
 *2007MaBingyao<andot@ujn.edu.cn>
 *Version:2.1
 *LastModified:Feb25,2007
 *Thislibraryisfree.Youcanredistributeitand/ormodifyit.
 */


/*
 *Interfaces:
 *utf8=utf16to8(utf16);
 *utf16=utf16to8(utf8);
 */


functionutf16to8(str){
    if(str.match(/^[\x00-\x7f]*$/)!=null){
        returnstr;
    }
    varout,i,j,len,c,c2;
    out=[];
    len=str.length;
    for(i=0,j=0;i<len;i++,j++){
        c=str.charCodeAt(i);
        if(c<=0x7f){
            out[j]=str.charAt(i);
        }
        elseif(c<=0x7ff){
            out[j]=String.fromCharCode(0xc0|(c>>>6),
                0x80|(c&0x3f));
        }
        elseif(c<0xd800||c>0xdfff){
            out[j]=String.fromCharCode(0xe0|(c>>>12),
                0x80|((c>>>6)&0x3f),
                0x80|(c&0x3f));
        }
        else{
            if(++i<len){
                c2=str.charCodeAt(i);
                if(c<=0xdbff&&0xdc00<=c2&&c2<=0xdfff){
                c=((c&0x03ff)<<10|(c2&0x03ff))+0x010000;
                if(0x010000<=c&&c<=0x10ffff){
                out[j]=String.fromCharCode(0xf0|((c>>>18)&0x3f),
                0x80|((c>>>12)&0x3f),
                0x80|((c>>>6)&0x3f),
                0x80|(c&0x3f));
                }
                else{
                out[j]="?";
                }
                }
                else{
                i--;
                out[j]="?";
                }
            }
            else{
                i--;
                out[j]="?";
            }
        }
    }
    returnout.join("");
}


functionutf8to16(str){
    if((str.match(/^[\x00-\x7f]*$/)!=null)||
        (str.match(/^[\x00-\xff]*$/)==null)){
        returnstr;
    }
    varout,i,j,len,c,c2,c3,c4,s;


    out=[];
    len=str.length;
    i=j=0;
    while(i<len){
        c=str.charCodeAt(i++);
        switch(c>>4){
            case0:case1:case2:case3:case4:case5:case6:case7:
            //0xxxxxxx
out[j++]=str.charAt(i-1);
            break;
            case12:case13:
            //110xxxxx10xxxxxx
c2=str.charCodeAt(i++);
            out[j++]=String.fromCharCode(((c&0x1f)<<6)|
                (c2&0x3f));
            break;
            case14:
            //1110xxxx10xxxxxx10xxxxxx
c2=str.charCodeAt(i++);
            c3=str.charCodeAt(i++);
            out[j++]=String.fromCharCode(((c&0x0f)<<12)|
                ((c2&0x3f)<<6)|
                (c3&0x3f));
            break;
            case15:
            switch(c&0xf){
                case0:case1:case2:case3:case4:case5:case6:case7:
                //11110xxx10xxxxxx10xxxxxx10xxxxxx
c2=str.charCodeAt(i++);
                c3=str.charCodeAt(i++);
                c4=str.charCodeAt(i++);
                s=((c&0x07)<<18)|
                ((c2&0x3f)<<12)|
                ((c3&0x3f)<<6)|
                (c4&0x3f)-0x10000;
                if(0<=s&&s<=0xfffff){
                out[j]=String.fromCharCode(((s>>>10)&0x03ff)|0xd800,
                (s&0x03ff)|0xdc00);
                }
                else{
                out[j]="?";
                }
                break;
                case8:case9:case10:case11:
                //111110xx10xxxxxx10xxxxxx10xxxxxx10xxxxxx
i+=4;
                out[j]="?";
                break;
                case12:case13:
                //1111110x10xxxxxx10xxxxxx10xxxxxx10xxxxxx10xxxxxx
i+=5;
                out[j]="?";
                break;
            }
        }
        j++;
    }
    returnout.join("");
}