I have to send characters like ü to the server as unicode character but as an ASCII-safe string. So it must be u00fc
(6 characters) not the character itself. But after JSON.stringify
it always gets ü regardless of what I’ve done with it.
If I use 2 backslashes like \u00fc
then I get 2 in the JSON
string as well and that’s not good either.
Important constraint: I can’t modify the string after JSON.stringify
, it’s part of the framework without workaround and we don’t want to fork the whole package.
Can this be done? If so, how?
5
If, for some reason, you want your JSON to be ASCII-safe, replace non-ascii characters after json encoding:
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));
8
This should get you to where you want. I heavily based this on this question: 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)
I would recommend though that you look into @t.niese comment about parsing this server side.
1
Depending on the exact scenario, you can affect the behavior of JSON.stringify by providing a toJSON
method as detailed here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#tojson_behavior
If an object has a toJSON
method that is a function, then calling JSON.stringify
on that will use the result of that method rather than the normal serialization. You could combine this with the approaches mentioned in other answers to get the result you want, even if a library doesn’t naturally provide any hooks for customization.
(Of course, its possible that a third-party library is itself doing something that overrides this behavior.)