def encode(string)
input = string.unpack('U*')
output = ''
n = INITIAL_N
delta = 0
bias = INITIAL_BIAS;
input.each { |cp| output << cp.chr if cp < 0x80 }
h = b = output.length
output << DELIMITER if b > 0
while h < input.length
m = MAXINT
input.each { |cp|
m = cp if (n...m) === cp
}
if m - n > (MAXINT - delta) / (h + 1)
raise BufferOverflowError
end
delta += (m - n) * (h + 1)
n = m
input.each { |cp|
if cp < n && (delta += 1) == 0
raise BufferOverflowError
end
if cp == n
q = delta
k = BASE
loop {
t = k <= bias ? TMIN : k - bias >= TMAX ? TMAX : k - bias;
break if q < t
output << encode_digit(t + (q - t) % (BASE - t), false)
q = (q - t) / (BASE - t)
k += BASE
}
output << encode_digit(q, false)
delta = h == b ? delta / DAMP : delta >> 1
delta += delta / (h + 1)
bias = 0
while delta > CUTOFF
delta /= LOBASE
bias += BASE
end
bias += (LOBASE + 1) * delta / (delta + SKEW)
delta = 0
h += 1
end
}
delta += 1
n += 1
end
output
end