如何实现Unicode样式字符转纯文本?附现有纯文本转Unicode样式字符代码
如何实现Unicode样式字符转纯文本?附现有纯文本转Unicode样式字符代码
嘿,我看到你已经有了一套把纯文本转换成Unicode样式字符(粗体、斜体这类)的代码,现在需要反过来把这些带样式的Unicode字符转回普通纯文本对吧?这就给你安排解决方案~
首先先把你提供的现有纯文本转Unicode样式的代码整理好(补全了未写完的boldItalic方法):
function convertText(text, style) { // 通用转换方法 const conv = { c: function(text, obj) { return text.replace(new RegExp(`[${obj.reduce((s, {r}) => s += r, "")}]`, "g"), e => { const t = e.codePointAt(0); // 只处理数字、大小写字母 if ((t >= 48 && t <= 57) || (t >= 65 && t <= 90) || (t >= 97 && t <= 122)) { return obj.reduce((s, {r, d}) => { if (new RegExp(`[${r}]`).test(e)) { s = String.fromCodePoint(e.codePointAt(0) + d); } return s; }, "") } return e; }) }, // 转粗体 bold: function(text) { return this.c(text, [ {r: "0-9", d: 120734}, {r: "A-Z", d: 120211}, {r: "a-z", d: 120205} ]) }, // 转斜体 italic: function(text) { return this.c(text, [ {r: "A-Z", d: 120263}, {r: "a-z", d: 120257} ]) }, // 转粗体斜体 boldItalic: function(text) { return this.c(text, [ {r: "0-9", d: 120734}, {r: "A-Z", d: 120211 + 52}, // 基于粗体偏移加上斜体的额外偏移 {r: "a-z", d: 120205 + 52} ]) } }; // 根据指定样式调用对应方法 return conv[style] ? conv[style](text) : text; }
接下来是反向转换的实现:我们需要根据正向转换的偏移量,把带样式的Unicode字符减去对应偏移,还原成普通字符。核心思路是先定义每个样式字符对应的普通字符偏移范围,然后逐个字符匹配并还原:
function reverseConvertText(styledText) { // 定义样式字符到普通字符的偏移映射,完全对应正向转换的规则 const reverseMaps = [ // 粗体数字:普通数字(48-57) + 120734 = 粗体数字的码点范围 { start: 48 + 120734, end: 57 + 120734, offset: -120734 }, // 粗体大写字母:普通大写(65-90) + 120211 = 粗体大写码点范围 { start: 65 + 120211, end: 90 + 120211, offset: -120211 }, // 粗体小写字母:普通小写(97-122) + 120205 = 粗体小写码点范围 { start: 97 + 120205, end: 122 + 120205, offset: -120205 }, // 斜体大写字母:普通大写(65-90) + 120263 = 斜体大写码点范围 { start: 65 + 120263, end: 90 + 120263, offset: -120263 }, // 斜体小写字母:普通小写(97-122) + 120257 = 斜体小写码点范围 { start: 97 + 120257, end: 122 + 120257, offset: -120257 }, // 粗体斜体大写字母:普通大写(65-90) + 120211+52 = 粗体斜体大写码点范围 { start: 65 + (120211 + 52), end: 90 + (120211 + 52), offset: -(120211 + 52) }, // 粗体斜体小写字母:普通小写(97-122) + 120205+52 = 粗体斜体小写码点范围 { start: 97 + (120205 + 52), end: 122 + (120205 + 52), offset: -(120205 + 52) } ]; return styledText.replace(/./gu, char => { const code = char.codePointAt(0); // 查找当前字符属于哪个样式范围,还原成普通字符 const match = reverseMaps.find(map => code >= map.start && code <= map.end); return match ? String.fromCodePoint(code + match.offset) : char; }); }
使用示例
// 正向转换:生成粗体文本 const boldText = convertText("Hello 123!", "bold"); console.log(boldText); // 输出:𝐇𝐞𝐥𝐥𝐨 𝟏𝟐𝟑! // 反向转换:还原成普通纯文本 const plainText = reverseConvertText(boldText); console.log(plainText); // 输出:Hello 123!
这个反向转换函数会自动识别所有你定义的样式字符,不管是粗体、斜体还是粗体斜体,都能准确还原成普通纯文本,而且不会影响原本就不是样式字符的内容(比如标点符号、特殊字符)。
备注:内容来源于stack exchange,提问作者Roderick Latoza




