href="http://zh.wikipedia.org/wiki/UTF-16">http://zh.wikipedia.org/wiki/UTF-16} * @param {String} str * @param {String} charset utf-8, utf-16 * @return {Number} */ var sizeof = function(str, charset){ var total = 0, charCode, i, len; charset = charset ? charset.toLowerCase() : ''; if(charset === 'utf-16' || charset === 'utf16'){ for(i = 0, len = str.length; i < len; i++){ charCode = str.charCodeAt(i); if(charCode <= 0xffff){ total += 2; }else{ total += 4; } } }else{ for(i = 0, len = str.length; i < len; i++){ charCode = str.charCodeAt(i); if(charCode <= 0x007f) { total += 1; }else if(charCode <= 0x07ff){ total += 2; }else if(charCode <= 0xffff){ total += 3; }else{ total += 4; } } } return total; } 龙腾一族至尊龙骑 *)
function decode_utf8_to_single(s:AnsiString):string; var i:Integer; single:AnsiString; b,b1,b2,b3,b4:Byte; index_in_single:Integer; //当前计算到了 single 单个 utf8 字符中的第几个字节了 begin Result := ''; single := ''; index_in_single := 0; s := AnsiToUtf8(s); for i := 1 to Length(s) do begin b := Byte(s[i]);
if index_in_single = 0 then begin b1 := b; if b1 < $80 then //if b1 <= $007f then //0x007f //单字节字符 //0zzzzzzz(00-7F)//7f的二进制是 01111111 第一个字节第一位为 0 的都是单字节字符 begin single := AnsiChar(b1); Result := Result + single + #13#10; index_in_single := 0; //重置位置 Continue; end;
end;
if index_in_single = 1 then begin b2 := b; if b1 < $e0 then //0x07ff //单字节字符 //0x07ff的二进制是 0111 11111111 //这个算法很奇怪,并没有用完全部的第二个字节 //它的意思是说第一个字节全部用完都为1的情况下用第2个字节的一半表示双字节的字符 begin single := AnsiChar(b1) + AnsiChar(b2); single := Utf8ToAnsi(single) + '| - 占用 2 字节'; //这个是为了还原为 gbk 而已 Result := Result + single + #13#10; index_in_single := 0; //重置位置 Continue; end;
end;
if index_in_single = 2 then begin b3 := b; if b1 < $f0 then //0x07ff //单字节字符 //0x07ff的二进制是 0111 11111111 //这个算法很奇怪,并没有用完全部的第二个字节 //它的意思是说第一个字节全部用完都为1的情况下用第2个字节的一半表示双字节的字符 begin single := AnsiChar(b1) + AnsiChar(b2) + AnsiChar(b3); single := Utf8ToAnsi(single) + '| - 占用 3 字节'; //这个是为了还原为 gbk 而已 Result := Result + single + #13#10; index_in_single := 0; //重置位置 Continue; end;
end;
if index_in_single = 3 then begin b4 := b; if b1 < $f8 then //目前来说其实不用判断也可以,除非以后扩展到超过 4 个字节了 // begin single := AnsiChar(b1) + AnsiChar(b2) + AnsiChar(b3) + AnsiChar(b4); single := Utf8ToAnsi(single) + '| - 占用 3 字节'; //这个是为了还原为 gbk 而已 Result := Result + single + #13#10; index_in_single := 0; //重置位置 Continue; end;
end;
index_in_single := index_in_single + 1; end;
end;
function decode_utf8_to_single_2020(s:AnsiString):string; var i:Integer; single:AnsiString; b,b1,b2,b3,b4:Byte; index_in_single:Integer; //当前计算到了 single 单个 utf8 字符中的第几个字节了 begin Result := ''; single := ''; index_in_single := 0; ////s := AnsiToUtf8(s); //输入就是 utf8 不要再转换了 for i := 1 to Length(s) do begin b := Byte(s[i]);
if index_in_single = 0 then begin b1 := b; if b1 < $80 then //if b1 <= $007f then //0x007f //单字节字符 //0zzzzzzz(00-7F)//7f的二进制是 01111111 第一个字节第一位为 0 的都是单字节字符 begin single := AnsiChar(b1); Result := Result + single + #13#10; index_in_single := 0; //重置位置 Continue; end;
end;
if index_in_single = 1 then begin b2 := b; if b1 < $e0 then //0x07ff //单字节字符 //0x07ff的二进制是 0111 11111111 //这个算法很奇怪,并没有用完全部的第二个字节 //它的意思是说第一个字节全部用完都为1的情况下用第2个字节的一半表示双字节的字符 begin single := AnsiChar(b1) + AnsiChar(b2); single := Utf8ToAnsi(single); // + '| - 占用 2 字节'; //这个是为了还原为 gbk 而已 Result := Result + single + #13#10; index_in_single := 0; //重置位置 Continue; end;
end;
if index_in_single = 2 then begin b3 := b; if b1 < $f0 then //0x07ff //单字节字符 //0x07ff的二进制是 0111 11111111 //这个算法很奇怪,并没有用完全部的第二个字节 //它的意思是说第一个字节全部用完都为1的情况下用第2个字节的一半表示双字节的字符 begin single := AnsiChar(b1) + AnsiChar(b2) + AnsiChar(b3); single := Utf8ToAnsi(single); // + '| - 占用 3 字节'; //这个是为了还原为 gbk 而已 Result := Result + single + #13#10; index_in_single := 0; //重置位置 Continue; end;
end;
if index_in_single = 3 then begin b4 := b; if b1 < $f8 then //目前来说其实不用判断也可以,除非以后扩展到超过 4 个字节了 // begin single := AnsiChar(b1) + AnsiChar(b2) + AnsiChar(b3) + AnsiChar(b4); single := Utf8ToAnsi(single); // + '| - 占用 4 字节'; //这个是为了还原为 gbk 而已 Result := Result + single + #13#10; index_in_single := 0; //重置位置 Continue; end;