Javascript 转义字符的困惑?

javascript 转义字符的困惑

我有一个base64编码的原始字符串,我想解码以后替换其中的一部分内容,需要将其中 Unicode 字符转成 Unicode 码点,但是是生成的是双反斜杠的,我无论如何都替换不成单反斜杠的。简单说我想将
[{"name":"String","value":"EFG\\u6DF1\\u5733"}]
转换成
[{"name":"String","value":"EFG\u6DF1\u5733"}]
困扰了几天毫无结果,哪位大佬能指点一下。

测试代码

function stringToUnicode(str) {
    let unicodeString = '';
    for (let i = 0; i < str.length; i++) {
        let charCode = str.charCodeAt(i);
        if (charCode > 0x100) { // 对于非 ASCII 字符
            let unicode = '\\u' + charCode.toString(16).toUpperCase();
            unicodeString += unicode;
        } else { // 对于 ASCII 字符,直接添加字符
            unicodeString += str[i];
        }
    }
    return unicodeString;
}

const string = 'W3sibmFtZSI6IlN0cmluZyIsInZhbHVlIjoiQUJDXHU1MzE3XHU0ZWFjIn1d';
const dataStr = Buffer.from(string, 'base64').toString();
console.log(dataStr); // [{"name":"String","value":"ABC\u5317\u4eac"}]

// 将 Base64 编码的字符串转换为 JSON 数据
var jsonData = JSON.parse(dataStr);
var string2 = stringToUnicode('EFG深圳');
string2 = string2.replace(/\\\\/g, '\\');
//string2 = `${string2.replace(/\\\\/g, '\\')}`;
jsonData[0].value = string2;
//console.log(jsonData); 

// 将解析后的 JSON 数据序列化为字符串
const jsonString = JSON.stringify(jsonData);
console.log(jsonString); // [{"name":"String","value":"EFG\\u6DF1\\u5733"}]

// 将 JSON 字符串转换为 Base64 编码
const base64EncodedNode = Buffer.from(jsonString, 'utf8').toString('base64');

console.log(base64EncodedNode); 

因为字符串转义符在replace时是不可见的
换言之,replace时,string2中没有两个斜杠,只有一个斜杠
想要获得unicode对应字符,需要挨个提取\\u(\w{1,4})后String.fromCharCode来还原
另外,\u6DF1并不是6个长度的字符串,它是和等价的,你可以用"\u6DF1".length来验证

您说的我能理解 "深" === "\u6DF1"
令我困惑的是 string2 = string2.replace(/\\\\u/g, ''); 替换失败, string2 = string2.replace(/\\u/g, ''); 替换成功,说明实际只存在一个反斜杠,但是最后的结果 W3sibmFtZSI6IlN0cmluZyIsInZhbHVlIjoiRUZHXFx1NkRGMVxcdTU3MzMifV0= 解码后是 [{"name":"String","value":"EFG\\u6DF1\\u5733"}] 又存在两个反斜杠。我怎么能得到 [{"name":"String","value":"EFG\u6DF1\u5733"}] 这个字串?

用正则挨个提取,然后转换数字部分到字符,也就是你写的stringToUnicode函数的逆向

json跟普通字符串是不同的。json把\n視為一字符,而在普通字符串中,不可保存\,只能是\\

json_decode只理普通字符串,而json_encode搞成json。

目前的js、php等都沒有「json⇔普通字符串」的功能。

我并不需要得到 [{"name":"String","value":"EFG深圳"}]
我发现
[{"name":"String","value":"EFG深圳"}]
[{"name":"String","value":"EFG\\u6DF1\\u5733"}]
[{"name":"String","value":"EFG\u6DF1\u5733"}]
这是三个不同的字串,我只需要最后一个。

那我想得到 [{"name":"String","value":"EFG\u6DF1\u5733"}] 能办到吗?

我是无法正常理解,在后面替换 jsonString = jsonString.replace(/\\\\/g, '\\'); 这样就行了。难道是 JSON.stringify 又转义了一次。

你搞错了,第一个和第三个是相同的字符串,你看到的不等同于程序接收到的

做不到。因\在js的string中是不存在的。

1 个赞

谢谢各位解惑,虽然没很懂,但是完成需求了。