在自己开发小型服务器时,后端解析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("");
}
}