前端给字符串参数编码已解决中文乱码

在自己开发小型服务器时,后端解析post请求中的字符串参数时,中文会乱码。
解决方式:给字符串参数编码成十六进制编码。

function UTF8() {
	this.encode = function(string) {
		var utftext = "";
		var byte = [];
		for ( var n = 0; n < string.length; n++) {
			var c = string.charCodeAt(n);// 获取对应的unicode
			if (c < 128) {
				utftext += '\\x' + c.toString(16).toUpperCase();// 单字节字符
				byte.push(c);
			} else {
				var byte_count = 2;
				if (c > 127 && c < 2048)
					byte_count = 2;
				else if (c > 2047 && c < 65536)
					byte_count = 3;
				else if (c > 65535 && c < 1114112)
					byte_count = 4;
				else
					return "编码失败!仅支持4位字节及以下的字符串编码!";

				// 生成8字节引用表
				var height_code = '';
				for ( var j = 0; j < 8; j++) {
					if (j < byte_count)
						height_code += '1';
					else
						height_code += '0';
				}

				//
				var d_code = parseInt(height_code, 2);
				for ( var i = byte_count - 1; i > -1; i--) {
					var bit = i * 6;
					if (i == byte_count - 1) {
						var code = ((c >> bit) | d_code);
						utftext += '\\x' + code.toString(16).toUpperCase();// 按位右移6位获取到需要与高8位11000000也就是192进行补位的位数,然后通过按位或运算进行补位
						byte.push(code)
					} else {
						// 63的二进制数是00000000
						// 00111111,通过按位与运算获取后6位需要与低8位10000000进行补位的位数,然后或运算补位
						var code = (((c >> bit) & 63) | 128);
						utftext += '\\x' + code.toString(16).toUpperCase();
						byte.push(code);
					}

				}
			}
		}
		return utftext;
	}
	/*
	 
	 * 
	 * 
	 * 
	 * */
	this.decode = function(utftext) {
		var string = "";
		// 将utf8字符串分割成单个的十六进制
		var split;
		if (utftext.indexOf(",")!=-1)
			split = utftext.split(',');
		else
			split = utftext.split('\\x');
		// 删除第一个空字符串
		if  (split[0] == "")
			split.splice(0,1);	//remove('');	// 数组
		// 对分割好的十六进制按照编码规则分组
		var group = [];
		var complete_binary_code = '';
		var count = -1;
		for ( var i = 0; i < split.length; i++) {
			var str = split[i];
			var number = parseInt(str, 16);// 转为10进制
			var binary = number.toString(2);// 转为二进制字符串
			// 不足8位的要进行补零
			for ( var j = 0; j < 8 - binary.length; j++) {
				binary = '0'+binary;
			}
			var index = binary.indexOf('0');// 查找第一个0出现的位置,也就是该组utf8的字节数
			if (index > 0) {
				if ((index > count && count != -1 && complete_binary_code != '')) {
					// index > count 表明是第二个分组了,但是要排除count==-1的情况,因为这是循环的开始
					group.push(complete_binary_code);
					complete_binary_code = '';
				} else if (i == split.length - 1) {
					// 最后一个元素
					complete_binary_code += binary.substr(index + 1, 7 - index);
					group.push(complete_binary_code);
				}
				complete_binary_code += binary.substr(index + 1, 7 - index);
				count = index;
			} else {
				if (count != -1 && complete_binary_code != '')
					group.push(complete_binary_code);// 上一组的数据需要先保存
				complete_binary_code = binary.substr(1, 7);
				group.push(complete_binary_code);
				complete_binary_code = '';
			}
		}

		for ( var i = 0; i < group.length; i++) {
			var binary_str = group[i];
			var char_code = parseInt(binary_str, 2);
			string += String.fromCharCode(char_code);
		}
		return string;
	}

	// 16位进制的数组,转为汉字。(此时汉字是GB2312)
	this.byteStringToString = function(bytes, encode) {
		bytes = bytes.replace(/,/g, "");
		return hexCharCodeToStr(bytes);
	}

	this.hexCharCodeToStr=function(hexCharCodeStr, encode) {
		var trimedStr = hexCharCodeStr.trim();
		var rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr
			.substr(2) : trimedStr;
		var len = rawStr.length;
		if (len % 2 !== 0) {
			alert("Illegal Format ASCII Code!");
			return "";
		}
		var curCharCode;
		var resultStr = [];
		for ( var i = 0; i < len; i = i + 2) {
			curCharCode = parseInt(rawStr.substr(i, 2), 16); // ASCII Code Value
			if (curCharCode > 128) {
				secondCharCode = parseInt(rawStr.substr(i + 2, 2), 16);
				i = i + 2;
				var a = secondCharCode + curCharCode * 256;
				resultStr.push(String.fromCharCode(a));
			} else
				resultStr.push(String.fromCharCode(curCharCode));
		}
		return resultStr.join("");
	}
}

猜你喜欢

转载自blog.csdn.net/yunxiang1224/article/details/89485615