如何使用String.fromCodepoint()将HTML实体格式的字符串转换为Unicode字符
如何使用String.fromCodepoint()将HTML实体格式的字符串转换为Unicode字符
嘿,这事儿其实挺简单的,你只需要把HTML实体里的十六进制码点提取出来,再传给String.fromCodePoint()就行,我给你一步步拆解清楚:
首先你手里的&#xXXXX;这种格式是HTML的十六进制Unicode实体,其中XXXX就是对应字符的Unicode码点(十六进制形式),而String.fromCodePoint()需要的是这个码点的数值——不管是十进制还是十六进制字面量,它都能识别。
具体步骤和代码示例
- 提取十六进制码点:用正则表达式匹配实体字符串,把
x后面到;前面的十六进制字符精准抓出来。 - 转换数值并生成字符:把提取到的十六进制字符串转成数值,再传给
String.fromCodePoint()就能得到对应的Unicode字符了。
我给你写了个可以直接复用的小函数,适配你给出的所有例子:
const getUnicodeChar = (htmlEntity) => { // 匹配十六进制HTML实体的正则,捕获中间的码点部分 const matchResult = htmlEntity.match(/&#x([0-9A-Fa-f]+);/); // 如果输入格式不对,直接返回原字符串避免报错 if (!matchResult) return htmlEntity; // 把十六进制码点转成十进制数值 const codePoint = parseInt(matchResult[1], 16); // 生成对应的Unicode字符 return String.fromCodePoint(codePoint); }; // 测试你的三个示例 console.log(getUnicodeChar("😁")); // 输出 😁 console.log(getUnicodeChar("ሴ")); // 输出 ሴ console.log(getUnicodeChar("@")); // 输出 @
更简洁的写法
要是你追求代码精简,也可以直接把提取到的十六进制字符串转成十六进制字面量传给方法,效果完全一样:
const getUnicodeChar = (htmlEntity) => { const match = htmlEntity.match(/&#x([0-9A-Fa-f]+);/); return match ? String.fromCodePoint(`0x${match[1]}`) : htmlEntity; };
另外补充一句,要是你碰到十进制的HTML实体(比如😁这种),只需要把正则改成/&#([0-9]+);/,然后用parseInt(match[1], 10)转成数值就行,适配性拉满。
内容来源于stack exchange
相关产品推荐
相关产品推荐

