假如我输入年薪30K以上这个用length属性判断后长度是7我的数据库编码是utf8mb4,一个汉字的长度相当于4但是如果这个字段存入数据库后相当于19加入我输入了【年薪30K以上】这个内容,我应该如何用js才能计算出他的长度是19
2 回答
慕少森
TA贡献2019条经验 获得超9个赞
utf8是变长编码的字符存储方式,utf8mb4只是每个字符最大长度占4字节,而非任一字符都占4字节。原本MySQL的utf8只能储存基本多语言平面(BMP)上的字符。utf8mb4编码之下,BMP上的字符和utf8编码完全相同,常用汉字仍然只占3个字节,真正占用四个字节的字符常见的只有姓名生辟字和表情符号。在MySQL数据库中varchar字段的长度是按字符来描述的,而不是字节,所以“年薪30K以上”用varchar(7)的字段就可以存得下。你可以自己试试:CREATETEMPORARYTABLE`test`(txtVARCHAR(7)NOTNULL)CHARSET='utf8mb4';INSERTINTO`test`VALUES('年薪30K以上');然而下面这个却保存不下:INSERTINTO`test`VALUES('12345678');ERROR1406(22001):Datatoolongforcolumn'txt'atrow1至于计算文本的utf8mb4编码字符串的字节长度,可以按字符编码范围来判断,根据RFC-3629的规范:从U+0000到U+007F占一个字节从U+0080到U+07FF占两个字节从U+0800到U+FFFF占三个字节从U+10000到U+10FFFF占四个字节functionbyteLength(str){letlen=0;console.log("单字节字符");str.replace(/[\u{00}-\u{7f}]/gu,e=>{len+=1;console.log(e);});console.log("双字节字符");str.replace(/[\u{80}-\u{07ff}]/gu,e=>{len+=2;console.log(e);});console.log("三字节字符");str.replace(/[\u{0800}-\u{ffff}]/gu,e=>{len+=3;console.log(e);});console.log("四字节字符");str.replace(/[\u{010000}-\u{10ffff}]/gu,e=>{len+=4;console.log(e);});returnlen;}console.log("总字节数",byteLength("English中文??Español?"));
添加回答
举报
0/150
提交
取消