JavaScript中如何仅转义字符串里的\u序列而保留其他转义符?
如何仅转义字符串中的控制字符(保留\f、\n等特定转义序列)?
问题描述
我从接口获取了如下字符串:
"���%<some-random-textcdtoolHxxx1-34e3-4069-b97c-xxxxxxxxxxx "
需要遍历该字符串,仅将其中的Unicode控制字符转换为\uXXXX格式的转义序列,得到的结果应为:
"\u0000\u0000\u0000\u001A%<some-random-textcdtoolHxxx1-34e3-4069-b97c-xxxxxxxxxxx\u001E "
注意:\f(换页符)和\n(换行符)不需要被转义。此前尝试正则表达式会错误转义\f、\n,而String.raw仅对字符串字面量有效,无法处理接口返回的字符串变量,请问该如何实现需求?
解决方案
实现思路
核心逻辑是逐个遍历字符串字符,精准判断需要转义的范围:
- 明确不需要转义的字符:
\n(ASCII 10)、\f(ASCII 12),以及所有可打印ASCII字符(码值32~126)。 - 对其余控制字符,转换为
\uXXXX格式的4位十六进制转义序列。
代码实现
function escapeOnlyControlChars(str) { let result = ''; for (const char of str) { const charCode = char.charCodeAt(0); // 跳过无需转义的字符:换行、换页、可打印ASCII字符 if (charCode === 10 || charCode === 12 || (charCode >= 32 && charCode <= 126)) { result += char; } else { // 转换为\uXXXX格式,补前导零确保4位长度 result += `\\u${charCode.toString(16).padStart(4, '0')}`; } } // 给结果添加外层双引号,匹配示例输出格式 return `"${result}"`; } // 测试示例 const input = "���%<some-random-textcdtoolHxxx1-34e3-4069-b97c-xxxxxxxxxxx\n"; const output = escapeOnlyControlChars(input); console.log(output);
代码说明
- 遍历字符串每个字符,获取其ASCII码值进行判断。
- 直接保留无需转义的字符,避免误转
\f和\n。 - 对控制字符统一处理为标准的
\uXXXX转义格式,确保输出符合要求。 - 最终给结果包裹双引号,与示例输出的格式完全匹配。
内容的提问来源于stack exchange,提问作者user2445220
相关产品推荐
相关产品推荐

