问题原因:
后台数据库使用的是UTF-8编码,一个中文字符在被存储时是3个字节
而前台一般使用获取字符长度的string.length获取的字符串长度中文依然是一个长度
英文在Unicode和UTF-8中的长度和字节都是一致的,只占用1个字节
因为汉字的unicode码区间为0x2e80-0x9fff, 所以汉字在UTF8中的长度最长为3个字节
这样导致前后台的长度校验不一致
当后台定义的某个字段长度较小时,如,后台定义最大50,
前台在需要校验输入长度时需要将字符串长度转换为UTF-8编码长度,这样才能保证前后台的长度校验一致性
使用下面的方法进行转换,可以获取到UTF-8的字符数组,再取长度进行校验即可
// 将字符串格式化为UTF8编码的字节
var writeUTF = function (str, isGetBytes) {
var back = [];
var byteSize = 0;
for (var i = 0; i < str.length; i++) {
var code = str.charCodeAt(i);
if (0x00 <= code && code <= 0x7f) {
byteSize += 1;
back.push(code);
} else if (0x80 <= code && code <= 0x7ff) {
byteSize += 2;
back.push((192 | (31 & (code >> 6))));
back.push((128 | (63 & code)))
} else if ((0x800 <= code && code <= 0xd7ff)
|| (0xe000 <= code && code <= 0xffff)) {
byteSize += 3;
back.push((224 | (15 & (code >> 12))));
back.push((128 | (63 & (code >> 6))));
back.push((128 | (63 & code)))
}
}
for (i = 0; i < back.length; i++) {
back[i] &= 0xff;
}
if (isGetBytes) {
return back
}
if (byteSize <= 0xff) {
return back;
}else{
return back;
}
}
writeUTF('我爱你');
// [230, 136, 145, 231, 136, 177, 228, 189, 160]