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
}
delta += (m - n) * (h + 1)
raise BufferOverflowError if delta > MAXINT
n = m
input.each { |cp|
if cp < n
delta += 1
raise BufferOverflowError if delta > MAXINT
elsif cp == n
q = delta
k = BASE
loop {
t = k <= bias ? TMIN : k - bias >= TMAX ? TMAX : k - bias
break if q < t
q, r = (q - t).divmod(BASE - t)
output << encode_digit(t + r, false)
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