short_url compared truncated.len() (byte length) against stripped.len()
(byte length), but truncated was built with .chars().take(max_len) which
counts code points. For multi-byte characters the byte lengths could
mismatch and produce wrong truncation. Compare char counts instead.
Twitter's API returns full_text with HTML entities already escaped
(& < > etc.), so the unescape→re-escape round-trip was a
no-op. Delete html_unescape entirely and pass text between entities
through verbatim, matching Nitter's approach. Only entity attributes
(URLs, display names from our processing) need html_escape.