4

将我的文本“加粗”(转换普通字符)为相应的特殊“粗体(衬线)”符号的正确方法是什么?

当我在浏览器中运行它时boldify("Hello World!"),我期望:

“!”

但我得到(当在 Opera 的谷歌开发者控制台中运行时):

" !function(_0x3298c7,_0x4d4daa){return this[_0x543a('0x9f')](new RegExp(_0x3298c7,'g'),_0x4d4daa);}"

最后附加的这个javascript函数字符串是什么?为什么会这样?

功能:

function boldify(txt) {
  let input = txt;
  let bold_input = "";
  let font = {
    'q': [55349, 56362],
    'w': [55349, 56368],
    'e': [55349, 56350],
    'r': [55349, 56363],
    't': [55349, 56365],
    'z': [55349, 56371],
    'u': [55349, 56366],
    'i': [55349, 56354],
    'o': [55349, 56360],
    'p': [55349, 56361],
    'a': [55349, 56346],
    's': [55349, 56364],
    'd': [55349, 56349],
    'f': [55349, 56351],
    'g': [55349, 56352],
    'h': [55349, 56353],
    'j': [55349, 56355],
    'k': [55349, 56356],
    'l': [55349, 56357],
    'y': [55349, 56370],
    'x': [55349, 56369],
    'c': [55349, 56348],
    'v': [55349, 56367],
    'b': [55349, 56347],
    'n': [55349, 56359],
    'm': [55349, 56358],
    'Q': [55349, 56336],
    'W': [55349, 56342],
    'E': [55349, 56324],
    'R': [55349, 56337],
    'T': [55349, 56339],
    'Z': [55349, 56345],
    'U': [55349, 56340],
    'O': [55349, 56328],
    'P': [55349, 56334],
    'A': [55349, 56335],
    'S': [55349, 56338],
    'D': [55349, 56323],
    'F': [55349, 56325],
    'G': [55349, 56326],
    'H': [55349, 56327],
    'J': [55349, 56329],
    'K': [55349, 56330],
    'L': [55349, 56331],
    'Y': [55349, 56344],
    'X': [55349, 56343],
    'C': [55349, 56322],
    'V': [55349, 56341],
    'B': [55349, 56321],
    'N': [55349, 56333],
    'M': [55349, 56332],
    '1': [55349, 57295],
    '2': [55349, 57296],
    '3': [55349, 57297],
    '4': [55349, 57298],
    '5': [55349, 57299],
    '6': [55349, 57300],
    '7': [55349, 57301],
    '8': [55349, 57302],
    '9': [55349, 57303],
    '0': [55349, 57294]
  };
  for (i in input) {
    let char = input[i];
    let char_code = font[char];
    if (char_code !== undefined) {
      let bold_char = String.fromCharCode(char_code[0], char_code[1]);
      bold_input += bold_char;
    } else {
      bold_input += char;
    }
  }
  return (bold_input);
}

console.log(boldify("Hello World!"))

4

2 回答 2

4

要么不使用for(i in input)构造 - 最直接的替换将是for ... of

for (const char of input) { ... }

...或检查它是否只处理字符,而不是字符串的其他道具...

for (i in input) if (input.hasOwnProperty(i)) { ... }

否则它将开始收集添加到 String 原型的函数。第一个函数——formatUnicorn在我的例子中(Chrome)——被添加到输出中。


作为旁注,该功能可以大大简化。例如,相同的数字 - 55349 - 用作所有粗体的第一个字符代码;将它添加到“映射”数组的每个元素是浪费时间和空间,因为它可以在String.fromCharCode(...)调用中内联。

但即使是一个数组在这里也有点浪费:如果你注意的话,你会发现只有三个序列——一个 for a-z,另一个 for A-Z,最后一个 for 0-9。应该存储这些值,而不是中间值。

最后,您可以使用简单的正则表达式仅定位您要替换的字符。

例如(只是一个概念):

function _getAdditionalCode(char) {
  const charCode = char.charCodeAt(0);
  return charCode + (
     charCode >= 97 ? 56346 - 97 : // 'a'..'z'
     charCode >= 65 ? 56320 - 65 : // 'A'..'Z'
                      57294 - 48   // '0'..'9'
  );
}

function boldify(txt) {
   return txt.replace(/[a-zA-Z0-9]/g, 
     ch => String.fromCharCode(55349, _getAdditionalCode(ch)));
}
于 2019-09-13T17:12:30.233 回答
3

正如PM 77-1所解释的, astring不是字符数组。

话虽如此,不同的 javascript 解释器可能会显示不同的输出。

您可以做的是拆分string并遍历它。

而不是for (i in input),你应该这样做for (i in input.split(''))

这会将字符串拆分为真正的字符数组,您可以安全地对其进行迭代。


关于您的代码的一个注释,您可以使用for...of语法来简化它。

for (let char of input.split('')) { ... }

for...of返回您正在迭代的值,而不是索引。

于 2019-09-13T17:14:04.703 回答