You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中解析/记录字符串时的转义、Unicode与字符转义问题

解决已解析字符串还原为原始转义格式的问题

当字符串被赋值到变量时,JavaScript引擎已经将所有转义序列(包括\uXXXX、\n等)解析为对应字符,原始的转义符号已不存在。要还原回用户输入的原始转义格式,需要反向将字符转换为对应的转义字符串,具体实现如下:

核心思路

  • 针对控制字符(如\n、\t、\b等),直接匹配字符本身而非正则元字符,避免混淆(比如正则中的\b是单词边界,而非退格符)。
  • 针对Unicode字符,将其码点转换为\uXXXX格式的转义序列。
  • 保留ASCII可打印字符(32-126)无需转义。

实现代码

function escapeString(str) {
  // 控制字符与转义字符串的映射
  const controlCharMap = {
    '\n': '\\n',
    '\t': '\\t',
    '\r': '\\r',
    '\b': '\\b',
    '\\': '\\\\',
    '/': '\\/'
  };

  return str.split('').map(char => {
    // 优先处理控制字符
    if (controlCharMap[char]) {
      return controlCharMap[char];
    }
    const codePoint = char.codePointAt(0);
    // ASCII可打印字符直接返回
    if (codePoint >= 32 && codePoint <= 126) {
      return char;
    }
    // 转换为4位十六进制Unicode转义序列
    return `\\u${codePoint.toString(16).padStart(4, '0').toUpperCase()}`;
  }).join('');
}

// 测试示例
let str = "some user generated better string that contains unicode escapes \u1451 \u3516 with some otehr escapes \n \t \r \b \\ / and so on";
console.log(escapeString(str));

关键说明

  • 处理\b时,直接匹配退格符字符本身('\b'),而非正则表达式的\b元字符,避免误替换单词边界。
  • String.raw仅适用于模板字面量的原始字符串,无法处理已被解析的字符串——此时原始转义信息已丢失,只能通过反向转换还原。
  • 若需处理超过U+FFFF的Unicode字符(如emoji),可扩展逻辑将码点转换为\u{XXXXXX}格式的转义序列。

内容的提问来源于stack exchange,提问作者Arnav Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:18:21