如何让JSON.stringify在没有“后处理”的情况下以ascii安全转义格式(\uXXXX)编码非ascii字符?

vm0i2vca  于 2022-12-20  发布在  其他
关注(0)|答案(3)|浏览(113)

我必须将ü这样的字符作为unicode字符发送到服务器,但必须是ASCII安全的字符串,所以它必须是\u00fc(6个字符),而不是字符本身,但在JSON.stringify之后,无论我对它做了什么,它总是得到ü
如果我使用2个反斜杠,比如\\u00fc,那么在JSON字符串中也会得到2,这也不好。

重要限制:我不能修改JSON.stringify后面的字符串,它是框架的一部分,没有解决方案,我们不想派生整个包。

这可以做到吗?如果可以,怎么做?

5gfr0r5j

5gfr0r5j1#

如果出于某种原因,您希望JSON是ASCII安全的,请在json编码后替换非ASCII字符:

var obj = {"key":"füßchen", "some": [1,2,3]}

var json = JSON.stringify(obj)
json  = json.replace(/[\u007F-\uFFFF]/g, function(chr) {
    return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).substr(-4)
})

document.write(json);
document.write("<br>");
document.write(JSON.parse(json));
d7v8vwbk

d7v8vwbk2#

这应该会让你达到你想要的目的。我很大程度上是基于这个问题:Javascript, convert unicode string to Javascript escape?

var obj = {"key":"ü"};
var str1 = JSON.stringify(obj);
var str2 = "";
var chr = "";
for(var i = 0; i < str1.length; i++){
    if (str1[i].match(/[^\x00-\x7F]/)){
        chr = "\\u" + ("000" + str1[i].charCodeAt(0).toString(16)).substr(-4);
    }else{
        chr = str1[i];
    }
    str2 = str2 + chr;
}  
console.log(str2)

不过我建议你看看关于解析这个服务器端的@t.niese注解。

waxmsbnn

waxmsbnn3#

根据具体的场景,您可以通过提供toJSON方法来影响JSON.stringify的行为,如下所述:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#tojson_behavior
如果一个对象的toJSON方法是一个函数,那么调用JSON.stringify将使用该方法的结果,而不是常规的序列化。您可以将此方法与其他答案中提到的方法结合起来,以获得您想要的结果,即使库本身并不提供任何用于定制的钩子。
(Of当然,也有可能是第三方库本身在做一些覆盖此行为的事情。)

相关问题