Другим способом сделать это может быть кодирование в двоичные типы, такие как целые числа со знаком / без знака, и ручное декодирование в http://snippets.dzone.com/posts/show/685, что потребует кода на стороне сервера для создания двоичных данных.
Затем можно выполнить сжатие Хаффмана или что-то подобное, например, RLE (см. http://rosettacode.org/wiki/Run-length_encoding#JavaScript для реализации, хотя в IE могут быть некоторые проблемы без изменения) для дальнейшего сжатия данных.
EDIT :
В качестве альтернативы, вы можете преобразовать сами числа в основание (основание) в диапазоне некодированных символов URI (см. http://en.wikipedia.org/wiki/Percent-encoding), что должно хорошо работать, если многие числа больше 2 цифр. Я преобразовал код в http://code.activestate.com/recipes/111286-numeric-base-converter-that-accepts-arbitrary-digi/ от Python, чтобы сделать это.
В настоящее время он не обрабатывает поплавки, но это может быть сделано довольно легко:
function get_map(s) {
d = {}
for (var i=0; i<s.length; i++) {
d[s.charAt(i)] = i}
d.length = s.length
d._s = s
return d}
var separate_with = '~';
var encodable = get_map('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.'); // - is reserved for negatives obviously :-P
var base10 = get_map('0123456789')
// UNCOMMENT ME for length/speed testing in a wider base!
// You may wish to experiment with the ranges for a happy medium between bandwidth and DB space :-P
/*var encodable = ''
for (var i=1; i<128; i++) {
encodable += String.fromCharCode(i)
}
encodable = get_map(encodable)*/
function baseconvert(number, fromdigits, todigits) {
var number = String(number)
if (number.charAt(0) == '-') {
number = number.slice(1, number.length)
neg=1}
else {
neg=0}
// make an integer out of the number
var x = 0
for (var i=0; i<number.length; i++) {
var digit = number.charAt(i)
x = x*fromdigits.length + fromdigits[digit]
}
// create the result in base 'todigits.length'
res = ""
while (x>0) {
remainder = x % todigits.length
res = todigits._s.charAt(remainder) + res
x = parseInt(x/todigits.length)
}
if (neg) res = "-"+res
return res
}
function encodeNums(L) {
var r = []
for (var i=0; i<L.length; i++) {
r.push(baseconvert(L[i], base10, encodable))
}
return r.join(separate_with)
}
function decodeNums(s) {
var r = []
var s = s.split(separate_with)
for (var i=0; i<s.length; i++) {
r.push(parseInt(baseconvert(s[i], encodable, base10)))
}
return r
}
var test = [5, 654645, 24324, 652124, 65, 65289543, 65278432, 643175874158, 652754327543]
alert(encodeNums(test))
alert(decodeNums(encodeNums(test)))