ensure we have done any conversion work required to farm out a UTF-8 encoded string. We perform two heap allocs here; the first one is the worst-case (four bytes per Unicode code point). This is usually quite pessimistic, so we perform a second allocation that's just the size we need.