mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
ccb62ceb57
Replaces each maximal run of invalid UTF-8 bytes with a replacement string (U+FFFD by default), returning a valid UTF-8 copy. Mirrors CRuby's String#scrub (Feature #6752) -- the recovery counterpart to the existing String#valid_encoding? detection API. Validation matches utf8code() in src/string.c after the RFC 3629 / Unicode D93b conformance fixup (#2708): overlong encodings, UTF-16 surrogates, and codepoints above U+10FFFF are all treated as invalid. This is stricter than the existing mrb_utf8len()-based check used by valid_encoding?, so a string can report valid_encoding? = true and still get scrubbed; aligning valid_encoding? is a follow-up. The block form lives in mrblib on top of two C primitives -- __scrub and __scrub_chunks -- to avoid VM re-entry from C per CLAUDE.md. Non-String block return values are coerced via to_s (CRuby raises TypeError instead; the choice is locked in by test). Closes #6859. Co-authored-by: Claude <noreply@anthropic.com>