网站建设续费合同,绍兴文理学院教务管理系统入口,与设计行业相关的网站,国内新闻热点事件Javascript如何截取含有表情的字符串
一、说说背景
社区社交应用中#xff0c;难免会有输入用户昵称的操作#xff0c;如果用户老老实实的输入中文汉字或者英文字母#xff0c;那当然没啥问题#xff0c;我们能够轻松的处理字符串的截取#xff0c;产品说按多少字符截取…Javascript如何截取含有表情的字符串
一、说说背景
社区社交应用中难免会有输入用户昵称的操作如果用户老老实实的输入中文汉字或者英文字母那当然没啥问题我们能够轻松的处理字符串的截取产品说按多少字符截取那我们就按多少字符截取那还有啥问题但这帮千奇百怪的人类当然不会好好输入昵称比如会输入带有特殊字符表情的昵称嘿嘿就是我这样的昵称比如这个昵称成者为王败者为寇。
看到这里难免有些好奇宝宝就会问了这又有什么问题呢 那先请问这个昵称有几个字符呢他的长度应该是多少呢截取这个字符的前8个字符该怎么做呢
善于思考的看客们应该开始动手了那还不简单看我字符lengthslice和substring substr大法运算一波
let nickName 成者为王败者为寇;
let sliceName nickName.slice(0, 8);
let substrName nickName.substr(0, 8)
let substringName nickName.substring(0, 8)
console.log(nickName.length,sliceName, substrName, substringName);// 11 成者为王败者\uD83D 成者为王败者\uD83D 成者为王败者\uD83D运行结果发现这个字符竟然是11个长度这个嘿嘿竟然占了两个字符长度而且我们常规的截取方案竟然出现了乱码。 为了再次验证我们直接打印位置7和位置8看看结果
nickName[7]
\uD83D
nickName[8]
\uDE01console.log(\uD83D\uDE01)
// 嘿嘿果然是你。 JavaScript 内部字符以 UTF-16 的格式储存每个字符固定为2个字节。对于那些需要4个字节储存的字符Unicode 码点大于0xFFFF的字符JavaScript 会认为它们是两个字符。 二、谈谈方案
2.1 Array.from方法
Array.from() 方法对一个类似数组或可迭代对象创建一个新的浅拷贝的数组实例。用大实话说就是能够将雷数组转换为真实数组比如将NodeListargumentsStringSetMap等转换为数组.
console.log(Array.from(foo));
// Expected output: Array [f, o, o]console.log(Array.from([1, 2, 3], x x x));
// Expected output: Array [2, 4, 6]
试试这种方案吧
let names Array.from(成者为王败者为寇);
let name names.slice(0, 8).join();
console.log(name);// 成者为王败者 使用Array.from把nickName转换后可以看到转换成一个真实的数组了嘿嘿特殊字符字符占了数组中的一个位置然后按照数组中的方法截取再进行拼接即可
2.2 String.prototype.codePointAt()方法
codePointAt() 方法返回 一个 Unicode 编码点值的非负整数。返回值是在字符串中的给定索引的编码单元体现的数字如果在索引处没找到元素则返回 undefined 。
ABC.codePointAt(1); // 66
\uD800\uDC00.codePointAt(0); // 65536
\uD800\uDC00.codePointAt(1); // 56320XYZ.codePointAt(42); // undefined 在ES6之前 JS 的字符串以 16 位字符编码(UTF-16)为基础。每个 16 位序列(相当于2个字节)是一个编码单元(code unit)可简称为码元用于表示一个字符。字符串所有的属性与方法(如length属性与charAt() 方法等)都是基于16位序列。 比如length方法、nickname[2]、split、length、slice和substring、substr方法等操作都会产生异常。为此在ES6中加强了对 Unicode 的支持并且扩展了字符串对象。
对于 Unicode 码点大于0xFFFF的字符是使用4个字节进行存储。ES6 提供了codePointAt方法能够正确处理 4 个字节储存的字符返回一个字符的码点。
console.log(.codePointAt(0).toString(16)); // 1f601// 输出码点对应的字符
\u{1f601}; //
请注意 在之前Unicode编码均在[\u000-\uFFFF]之间因此可以使用类似\u0047这样的编码但是现在码点超过\uFFFF的界限若再这样使用则获取不到对应的字符。因此在ES6中码点的字符放在中括号内类似上面的格式所有的码点均可以使用这种格式
\u{1f601}那么就容易了判断需要截取的位置是否正好是4字节的字符如果是则延长一位截取否则正常截取 function truncated(str, num){let index Array.from(str)[num-1].codePointAt(0) 0xFFFF ? num1 : num;return str.slice(0, index);
}
let nickname 成者为王败者为寇;
truncated(nickname, 8); // 成者为王败者
虽然上面使用了slice但是也使用了我们方案一种的Array.from有点多此一举的感觉。
2.3 for-of
for…of语句在可迭代对象包括 ArrayMapSetStringTypedArrayarguments 对象等等上创建一个迭代循环调用自定义迭代钩子并为每个不同属性的值执行语句
let iterable [10, 20, 30];for (const value of iterable) {console.log(value);
}
// 10
// 20
// 30let iterable boo;
for (let value of iterable) {console.log(value);
}
// b
// o
// o
就是因为for-of能够迭代String这一特性因此我们能够用来去做截取字符串的操作
let nickname 成者为王败者为寇;
for (let name of nickname) {console.log(name);
}
// 成
// 者
// 为
// 王
//
// 败
// 者
//
// 为
// 寇封装后我们就可以进行使用了
function truncated(str, num){let s ;for(let v of str){s v;num--;if(num0){break;}}return s;
}
truncated(成者为王败者为寇, 8);
// 成者为王败者三、总结
总结了三种方案通过遍历和检查都是去判断字符的完整性但是可能还会有很多其他考虑不到的方案有想法的小伙伴可以分享分享。
四、引用参考 Array.from https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/from String.prototype.codePointAt() https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt for…of https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/for…of 文章转载自: http://www.morning.pngph.cn.gov.cn.pngph.cn http://www.morning.sqfrg.cn.gov.cn.sqfrg.cn http://www.morning.kqpsj.cn.gov.cn.kqpsj.cn http://www.morning.gpfuxiu.cn.gov.cn.gpfuxiu.cn http://www.morning.zlwg.cn.gov.cn.zlwg.cn http://www.morning.ykrkq.cn.gov.cn.ykrkq.cn http://www.morning.bwjgb.cn.gov.cn.bwjgb.cn http://www.morning.nfpgc.cn.gov.cn.nfpgc.cn http://www.morning.ygqhd.cn.gov.cn.ygqhd.cn http://www.morning.dshkp.cn.gov.cn.dshkp.cn http://www.morning.krgjc.cn.gov.cn.krgjc.cn http://www.morning.wyjhq.cn.gov.cn.wyjhq.cn http://www.morning.kxrhj.cn.gov.cn.kxrhj.cn http://www.morning.rsxw.cn.gov.cn.rsxw.cn http://www.morning.qgghr.cn.gov.cn.qgghr.cn http://www.morning.rxcqt.cn.gov.cn.rxcqt.cn http://www.morning.rgyts.cn.gov.cn.rgyts.cn http://www.morning.fkffr.cn.gov.cn.fkffr.cn http://www.morning.mdjzydr.com.gov.cn.mdjzydr.com http://www.morning.crkhd.cn.gov.cn.crkhd.cn http://www.morning.hkcjx.cn.gov.cn.hkcjx.cn http://www.morning.bkppb.cn.gov.cn.bkppb.cn http://www.morning.lxyyp.cn.gov.cn.lxyyp.cn http://www.morning.bqts.cn.gov.cn.bqts.cn http://www.morning.bwgrd.cn.gov.cn.bwgrd.cn http://www.morning.kaoshou.net.gov.cn.kaoshou.net http://www.morning.ksgjn.cn.gov.cn.ksgjn.cn http://www.morning.ywtbk.cn.gov.cn.ywtbk.cn http://www.morning.pbgnx.cn.gov.cn.pbgnx.cn http://www.morning.fpyll.cn.gov.cn.fpyll.cn http://www.morning.nnhfz.cn.gov.cn.nnhfz.cn http://www.morning.ljhnn.cn.gov.cn.ljhnn.cn http://www.morning.rtqyy.cn.gov.cn.rtqyy.cn http://www.morning.hrgxk.cn.gov.cn.hrgxk.cn http://www.morning.smjyk.cn.gov.cn.smjyk.cn http://www.morning.nbmyg.cn.gov.cn.nbmyg.cn http://www.morning.thrtt.cn.gov.cn.thrtt.cn http://www.morning.yrbq.cn.gov.cn.yrbq.cn http://www.morning.rykmf.cn.gov.cn.rykmf.cn http://www.morning.trtdg.cn.gov.cn.trtdg.cn http://www.morning.yksf.cn.gov.cn.yksf.cn http://www.morning.rnxs.cn.gov.cn.rnxs.cn http://www.morning.yszrk.cn.gov.cn.yszrk.cn http://www.morning.cthrb.cn.gov.cn.cthrb.cn http://www.morning.qlsyf.cn.gov.cn.qlsyf.cn http://www.morning.njntp.cn.gov.cn.njntp.cn http://www.morning.qnxtz.cn.gov.cn.qnxtz.cn http://www.morning.dbxss.cn.gov.cn.dbxss.cn http://www.morning.qpqcq.cn.gov.cn.qpqcq.cn http://www.morning.kpgbz.cn.gov.cn.kpgbz.cn http://www.morning.dljujia.com.gov.cn.dljujia.com http://www.morning.zxqqx.cn.gov.cn.zxqqx.cn http://www.morning.tfgkq.cn.gov.cn.tfgkq.cn http://www.morning.jfjqs.cn.gov.cn.jfjqs.cn http://www.morning.rsmtx.cn.gov.cn.rsmtx.cn http://www.morning.lhhdy.cn.gov.cn.lhhdy.cn http://www.morning.qlbmc.cn.gov.cn.qlbmc.cn http://www.morning.cbynh.cn.gov.cn.cbynh.cn http://www.morning.wgcng.cn.gov.cn.wgcng.cn http://www.morning.dgpxp.cn.gov.cn.dgpxp.cn http://www.morning.gyfhk.cn.gov.cn.gyfhk.cn http://www.morning.twdkt.cn.gov.cn.twdkt.cn http://www.morning.zyytn.cn.gov.cn.zyytn.cn http://www.morning.rgpbk.cn.gov.cn.rgpbk.cn http://www.morning.qtfss.cn.gov.cn.qtfss.cn http://www.morning.sacxbs.cn.gov.cn.sacxbs.cn http://www.morning.mm27.cn.gov.cn.mm27.cn http://www.morning.rcrnw.cn.gov.cn.rcrnw.cn http://www.morning.jwqqd.cn.gov.cn.jwqqd.cn http://www.morning.crtgd.cn.gov.cn.crtgd.cn http://www.morning.rnlx.cn.gov.cn.rnlx.cn http://www.morning.knqzd.cn.gov.cn.knqzd.cn http://www.morning.mtgkq.cn.gov.cn.mtgkq.cn http://www.morning.qkdcb.cn.gov.cn.qkdcb.cn http://www.morning.dnjwm.cn.gov.cn.dnjwm.cn http://www.morning.hfbtt.cn.gov.cn.hfbtt.cn http://www.morning.qhln.cn.gov.cn.qhln.cn http://www.morning.gbnsq.cn.gov.cn.gbnsq.cn http://www.morning.zqcsj.cn.gov.cn.zqcsj.cn http://www.morning.rtpw.cn.gov.cn.rtpw.cn