在JavaScript中取消转义的字符串

3

我正在运行一个循环来显示特定Unicode转义序列的字符。

var es = '';

for (var i = 0; i <= 9999; i++) {
  if (i < 10) {
    es = '\\u000' + i;
  } else if (i < 100) {
    es = '\\u00' + i;
  } else {
    es = '\\u' + i;
  }
  console.log(es);
}

...然而,它并不显示字符,只显示序列。在JavaScript中有没有办法取消转义序列以强制显示字符?


请注意,您的代码未创建正确的转义序列:它未正确地进行零填充,并且使用十进制数字而不是Unicode转义所需的十六进制数字。如果您需要执行此操作,请使用类似jsesc的库。 - Mathias Bynens
2个回答

2

对于那些偶然发现这个问题(很可能是我未来的自己)想要“取消转义”之前已经转义过的JavaScript特殊字符的人,下面是一个hacky的方法:

newString = JSON.stringify(string).slice(1,-1)

然而,这似乎只适用于某些字符,如\t\n\r\f\b\\等。
更好地解释一下,在制表符的情况下,这将把制表符字符转换回文字/原始字符串,即\t

回答的动机:https://github.com/mdx-js/mdx/issues/370 - V. Rubinetti

0

要做到这一点,您需要使用String.fromCharCode()

var es = '';
for (var i = 0; i < 9999; ++i) {
  es = String.fromCharCode(i);
  // ...
}

\uNNNN 语法只能在较大的字符串常量内使用常量值。

编辑 — 下面的重要评论指出,由于 JavaScript 字符串的问题 UTF-16 实现,.fromCharCode() 在处理超出基本多文种平面的字符时会出现问题。因此,ES6(ES2015)有一个类似的函数 String.fromCodePoint(),它可以处理 16 位范围之外的 "星际" 字符。更多信息请参见此处 和评论中的链接。


有趣的、简短的问题。为什么 fromCharCode('\u2665') 返回一个空字符串,而如果我只是在控制台中记录该序列,我会得到 ♥。 - arnolds
1
fromCharCode() 函数期望其参数为数字。当它试图将 '\u2665' 转换为数字时,得到的是 NaN,因此你会得到一个空字符串。请尝试使用 String.fromCharCode(parseInt("2665", 16)) - Pointy
如何处理诸如\uabc1等值 - arnolds
将十六进制字符串 "abc1" 转化成数字后,再转化成对应的 Unicode 字符。 - Pointy
实际上,你需要使用String.fromCodePoint,它(与String.fromCharCode不同)可以正确处理辅助字符 - Mathias Bynens
@MathiasBynens 哦,没错,你说得对;那是个好观点。谢谢。 - Pointy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接