生僻字的length算2,有些空格是特殊空格,比如\u3000
u+3000不是全角空格,u+3000是表意字空格(Ideographic Space),宽度和一个表意字(汉字)相同。它应当被当做汉字来处理。比如,在一些排版中,在特别尊敬的人的名字前面要空一格,这时候就应该用表意字空格u+3000。或者在一些中文名单列表里,两个字的姓名要中间空一个字,来和三个字的姓名对齐,这时候也应该用表意字空格u+3000。由上可知,表意字空格u+3000绝不能被随意删去,否则会导致排版甚至语义出现问题。u+2003才是全角空格(Em Space,更准确的翻译是全身空格),宽度和一个字身高度相同(也就是等于字号)。这两者在大部分情况下宽度相同,因而容易混淆。但是,假设有一款中文字体的汉字是窄的,比如宽度只有高度的三分之二,那么,此时表意字空格u+3000也应该和汉字一样是三分之二宽,而全角空格u+2003应该始终是个正方形(宽度和高度一样)
\u3000之类的特殊空格无法用js自带的trim()删除,但可以用正则的\s删除
let str = ' abcde ';// 使用一个正则表达式同时处理开头和结尾的空格
str = str.replace(/^\s+|\s+$/g, match => 'p'.repeat(match.length));
// console.log(str);
/*
charAt 返回的是指定位置的字符(字符串形式)。
charCodeAt 返回的是指定位置的字符的 Unicode 编码(数值形式,10进制)。
Unicode编码取值: 0 - 65535 (0x0000 - 0xFFFF),
js中Unicode是以十六进制代码外加开头 \u 表示的字符串,例如:爱 js中表示为 \u7231
*/
var r='魇😀😀🤣𠮷严 a 𤾩 w看'
for(let i of r){console.log('======length测量的长度',i.length);if(i.length==2){for (let j = 0; j < i.length; j++) { let char = i.charAt(j);let code = i.charCodeAt(j);let pt = i.codePointAt(j);console.log(`当前是${i},长度为2:,charAt为 ${char},10进制: ${code}, 16进制: ${code.toString(16)},码点:${pt}`); }}else{let char = i.charAt();let code = i.charCodeAt(); let pt = i.codePointAt();console.log(`当前是${i},长度为1: charAt为${char},10进制: ${code}, 16进制: ${code.toString(16)},码点:${pt}`); }
}
//fromCodePoint可以接受0x开头的16进制,也可以默认的10进制
String.fromCodePoint(0xd83d,0xde00);//输出😀
String.fromCodePoint(119,30475);//输出w看
String.fromCodePoint(39751);//如果字符length为2,用codePointAt获取第0位的码点即可还原/***********************\
\u4e2d\u56fd中国
4e2d转成10进制是20013
56fd转成10进制是22269
/***********************/
String.fromCharCode(20013)//中
String.fromCharCode(22269)//国