@@ -531,7 +531,14 @@ encodeUtf8_2 (Text arr off len)
531531 with ptr $ \destPtr -> do
532532 c_encode_utf8 destPtr (A.aBA arr) (fromIntegral off) (fromIntegral len)
533533 newDest <- peek destPtr
534− return (PS fp 0 (newDest `minusPtr` ptr))
534+ let utf8len = newDest `minusPtr` ptr
535+ if utf8len >= len `shiftR` 1
536+ then return (PS fp 0 utf8len)
537+ else do
538+ fp' <- mallocByteString utf8len
539+ withForeignPtr fp' $ \ptr' -> do
540+ memcpy ptr' ptr (fromIntegral utf8len)
541+ return (PS fp' 0 utf8len)
535542
536543-- | Decode text from little endian UTF-16 encoding.
537544decodeUtf16LEWith :: OnDecodeError -> ByteString -> Text