function hex(number) { var hexDigit = "0123456789ABCDEF"; var hex = hexDigit.substr(number & 0xf, 1); while (number > 15) { number >>= 4; hex = hexDigit.substr(number & 15, 1) + hex; } return hex; } function decodeText(charsetName, characterSequence) { var req = new XMLHttpRequest; req.open('GET', 'data:text/plain,' + characterSequence, false); req.overrideMimeType('text/plain; charset="' + charsetName + '"'); req.send(''); return req.responseText; } function decode(charsetName, characterSequence) { var decodedText = decodeText(charsetName, characterSequence); var result = ""; for (var i = 0; i < decodedText.length; ++i) { var code = hex(decodedText.charCodeAt(i)); if (i) result += "/"; result += "U+" + ("0000" + code).substr(code.length, 4); } return result; } function testDecode(charsetName, characterSequence, unicode) { shouldBe("decode('" + charsetName + "', '" + characterSequence + "')", "'" + unicode + "'"); } function batchTestDecode(inputData) { for (var i in inputData.encodings) { for (var j in inputData.encoded) testDecode(inputData.encodings[i], inputData.encoded[j], inputData.unicode[j]); } }