javascript中string转UTF8格式byte数组

在javascript代码中,有些地方我们需要将string转为byte数组再进行进一步处理,网上太少这方面的资料。这里我根据java中String.getByte(“UTF-8”)的实现机制来进行string转byte数组的处理,同时解决中文和非英文字母转byte数组时的编码问题。其代码如下:
/**
 *@description:将string转为UTF-8格式signed char字节数组
 *
 */
function stringToBytes(str){
	var bytes = new Array();
	for (var i = 0; i < str.length; i++) {
		var c = str.charCodeAt(i);
		var s = parseInt(c).toString(2);
		if(c >= parseInt("000080",16) && c <= parseInt("0007FF",16)){
			var af = "";
			for(var j = 0; j < (11 - s.length); j++){
				af += "0";
			}
			af += s;
			var n1 = parseInt("110" + af.substring(0,5),2);
			var n2 = parseInt("110" + af.substring(5),2);
			if(n1 > 127) n1 -= 256;
			if(n2 > 127) n2 -= 256;
			bytes.push(n1);
			bytes.push(n2);
		}else if(c >= parseInt("000800",16) && c <= parseInt("00FFFF",16)){
			var af = "";
			for(var j = 0; j < (16 - s.length); j++){
				af += "0";
			}
			af += s;
			var n1 = parseInt("1110" + af.substring(0,4),2);
			var n2 = parseInt("10" + af.substring(4,10),2);
			var n3 = parseInt("10" + af.substring(10),2);
			if(n1 > 127) n1 -= 256;
			if(n2 > 127) n2 -= 256;
			if(n3 > 127) n3 -= 256;
			bytes.push(n1);
			bytes.push(n2);
			bytes.push(n3);
		}else if(c >= parseInt("010000",16) && c <= parseInt("10FFFF",16)){
			var af = "";
			for(var j = 0; j < (21 - s.length); j++){
				af += "0";
			}
			af += s;
			var n1 = parseInt("11110" + af.substring(0,3),2);
			var n2 = parseInt("10" + af.substring(3,9),2);
			var n3 = parseInt("10" + af.substring(9,15),2);
			var n4 = parseInt("10" + af.substring(15),2);
			if(n1 > 127) n1 -= 256;
			if(n2 > 127) n2 -= 256;
			if(n3 > 127) n3 -= 256;
			if(n4 > 127) n4 -= 256;
			bytes.push(n1);
			bytes.push(n2);
			bytes.push(n3);
			bytes.push(n4);
		}else{
			bytes.push(c & 0xff);
		}
	}
	return bytes;
}
这样,就完成了string通过UTF-8转byte数组。
经过算法可精简为以下代码:
function str2UTF8(str){
	var bytes = new Array(); 
	var len,c;
	len = str.length;
	for(var i = 0; i < len; i++){
		c = str.charCodeAt(i);
		if(c >= 0x010000 && c <= 0x10FFFF){
			bytes.push(((c >> 18) & 0x07) | 0xF0);
			bytes.push(((c >> 12) & 0x3F) | 0x80);
			bytes.push(((c >> 6) & 0x3F) | 0x80);
			bytes.push((c & 0x3F) | 0x80);
		}else if(c >= 0x000800 && c <= 0x00FFFF){
			bytes.push(((c >> 12) & 0x0F) | 0xE0);
			bytes.push(((c >> 6) & 0x3F) | 0x80);
			bytes.push((c & 0x3F) | 0x80);
		}else if(c >= 0x000080 && c <= 0x0007FF){
			bytes.push(((c >> 6) & 0x1F) | 0xC0);
			bytes.push((c & 0x3F) | 0x80);
		}else{
			bytes.push(c & 0xFF);
		}
	}
	return bytes;
}

具体为什么这么转,可以参考我的另一篇博客http://blog.csdn.net/a123638/article/details/46532385。

版权所有,嘿嘿!
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值