`

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;
	}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics