The Ampersand (&) XML Problem
by z3n on Sep.26, 2009, under Coding
Problem:
Having ampersands (&) on a xml makes it non-compliant, causing errors on IE.
Solution:
I’ve been looking on this issue for a while, although I had the answer already I wanted an alternate. One said that you could turn the & into & html entity or it’s ASCII code, but this just gets into another issue, since the & will still there – & & – In my case I had accents encoded as html entities, like áéíóú, which must be encoded (at least on my project) as entities to be passed as xml/json/etc. Other people noted that it’s possible to have specific entities declared on the html header, although this is a drawback, because xml will become quite big if you have too many different entities AND you will have to redeclare them on every reply.
None of the solutions I’ve found were good, so I’m posting mine.
A simple base64 encode would resolve the issue, and you only need to do it on replies, making things easier, so you send as base64 and the user with a little javascript decodes it back.
Base64 Javascript Source Code:
-
var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
-
-
function _enc(input) {
-
var output = "";
-
var chr1, chr2, chr3;
-
var enc1, enc2, enc3, enc4;
-
var i = 0;
-
do {
-
chr1 = input.charCodeAt(i++);
-
chr2 = input.charCodeAt(i++);
-
chr3 = input.charCodeAt(i++);
-
-
enc1 = chr1 >> 2;
-
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
-
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
-
enc4 = chr3 & 63;
-
-
if (isNaN(chr2)) {
-
enc3 = enc4 = 64;
-
} else if (isNaN(chr3)) {
-
enc4 = 64;
-
}
-
-
output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) +
-
keyStr.charAt(enc3) + keyStr.charAt(enc4);
-
} while (i < input.length);
-
-
return output;
-
}
-
-
function _dec(input) {
-
if (input == "NULL") { return ""; }
-
var output = "";
-
var chr1, chr2, chr3;
-
var enc1, enc2, enc3, enc4;
-
var i = 0;
-
-
// remove all characters that are not A-Z, a-z, 0-9, +, /, or =
-
input = input.replace(/[^A-Za-z0-9\+\/\=]/g|>, "");
-
-
do {
-
enc1 = keyStr.indexOf(input.charAt(i++));
-
enc2 = keyStr.indexOf(input.charAt(i++));
-
enc3 = keyStr.indexOf(input.charAt(i++));
-
enc4 = keyStr.indexOf(input.charAt(i++));
-
-
chr1 = (enc1 << 2) | (enc2 >> 4);
-
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
-
chr3 = ((enc3 & 3) << 6) | enc4;
-
-
output = output + String.fromCharCode(chr1);
-
-
if (enc3 != 64) {
-
output = output + String.fromCharCode(chr2);
-
}
-
if (enc4 != 64) {
-
output = output + String.fromCharCode(chr3);
-
}
-
} while (i < input.length);
-
-
return output;
-
}