Javasrript 转unicode编码为utf-8
理论储备:
UTF是 Unicode Translation Format,即把Unicode转做某种格式的意思。 在Unicode基本多文种平面定义的字符(无论是拉丁字母、汉字或其他文字或符号),一律使用2字节储存。而在辅助平面定义的字符,会以代理对(surrogate pair)的形式,以两个2字节的值来储存。
unicode是一种编码方式,和ascii是同一个概念,而UTF是一种存储方式(格式)。
在jvm内部,虚拟机管理数据(内存里)时,或者在进行对象序列化的时候,字符(串)都是以unicode编码方式的。
但是在jvm中,字符(串)是以char 这种(存储)形式存放的,一个char占2个字节(例如可以定义char c='字'),就是“字”和“Z”是同样占2个字节的;而在对象序列化后,对象是进行UTF-8存储的,一个中文占3个字节,而英文、数字等只占一个字节,可以参看下面的链接。
所以导致系列化以后的对象只占平时的大约一半的空间(当全是中文时占用相同的空间;全是英文时unicode占用的空间是UTF-8的2倍)。
UTF-16比起UTF-8,好处在于大部分字符都以固定长度的字节 (2字节) 储存,但UTF-16却无法兼容于ASCII编码。
function UU(AA,ZZ){
if(null==ZZ || ZZ>=16) ZZ=0;
if(null==AA || AA.length<4 || 0!=(3&AA.length)) return "";
var KK="";
for(var i=0; i<AA.length; i+=4)
{
var ___utf16=parseInt(AA.substr(i,4),16);
var RR=0;
switch(ZZ)
{
case 1:
RR=0x0001;
break;
case 2:
RR=0x0003;
break;
case 3:
RR=0x0007;
break;
case 4:
RR=0x000F;
break;
case 5:
RR=0x001F;
break;
case 6:
RR=0x003F;
break;
case 7:
RR=0x007F;
break;
case 8:
RR=0x00FF;
break;
case 9:
RR=0x01FF;
break;
case 10:
RR=0x03FF;
break;
case 11:
RR=0x07FF;
break;
case 12:
RR=0x0FFF;
break;
case 13:
RR=0x1FFF;
break;
case 14:
RR=0x3FFF;
break;
case 15:
RR=0x7FFF;
break;
case 16:
RR=0xFFFF;
break;
}
var OO=(RR&___utf16);
___utf16&=(~RR);
___utf16>>=ZZ;
___utf16|=(OO<<(16-ZZ));
KK+=String.fromCharCode(___utf16);
ZZ=(0x000F&___utf16);
}
return KK;
}
var result = UU("ce4e94d3d4d5042f0383c93ab32d0a00636baf442900e11a7ea60c8000c07c739182004201480150e0852759543327596cbda0ae003c100600400068720001940cc00f404004008c0348c80003d0a006064000d0032000e46e001980011000f8801000e4df1b00143100006e1c00ef8d80147800f0028030007c000a505700355b2f520060a44e94f8a7c1966751f5b26400382d600105f8540e235c523053e680134e2a513af8a7c1966751f5b262000078600413c0002700150200004302780026f004002900f46004023011800c00003000300030003e000f200400f823db84e53c00f002002100f8000ff002002313c00027001503e0000f100600400068720001940cc00f404004008c0348c80003d0a006064000d003600dc01b000cc0011000f8800c00d80d807be3001ef0028030007c000a50570034ad97520060a44e2deb248ba9f44ad97a169c7001e3f1364df8de2fc053f36b847ea60cc001c860007c7391824e2d2b8eb24eb32d085ace58890e28001753f44a2900",8);
JAVA CODE JAVASCRIPT转写版
public static String UU(String AA, int ZZ) throws UnsupportedEncodingException {
if (/* null==ZZ || */ZZ >= 16)
ZZ = 0;
if (null == AA || AA.length() < 4 || 0 != (3 & AA.length()))
return "";
System.out.println(AA);
System.out.println(AA.substring(0, 4));
String KK = "";
for (int i = 0; i < AA.length(); i += 4) {
int ___utf16 = Integer.parseInt(AA.substring(i, i + 4), 16);
// System.out.println(___utf16);
int RR = 0;
switch (ZZ) {
case 1:
RR = 0x0001;
break;
case 2:
RR = 0x0003;
break;
case 3:
RR = 0x0007;
break;
case 4:
RR = 0x000F;
break;
case 5:
RR = 0x001F;
break;
case 6:
RR = 0x003F;
break;
case 7:
RR = 0x007F;
break;
case 8:
RR = 0x00FF;
break;
case 9:
RR = 0x01FF;
break;
case 10:
RR = 0x03FF;
break;
case 11:
RR = 0x07FF;
break;
case 12:
RR = 0x0FFF;
break;
case 13:
RR = 0x1FFF;
break;
case 14:
RR = 0x3FFF;
break;
case 15:
RR = 0x7FFF;
break;
case 16:
RR = 0xFFFF;
break;
}
int OO = (RR & ___utf16);
___utf16 &= (~RR);
___utf16 >>= ZZ;
___utf16 |= (OO << (16 - ZZ));
// System.out.println(___utf16);
byte[] chara = new byte[2];
chara[0] = (byte)((___utf16 & 0x0000ff00) >> 8);
chara[1] = (byte)(___utf16 & 0x000000ff);
// if(Integer.toHexString(___utf16).length() == 2){
// KK+="00" + Integer.toHexString(___utf16);
// }else{
// KK+=Integer.toHexString(___utf16);
// }
KK += new String(chara, "UTF16");
ZZ = (0x000F & ___utf16);
}
return KK;
}