PSL 6.1.1
Str\chr() and Str\from_code_points() now reject invalid Unicode code points
Str\chr() previously returned an empty string for invalid code points (negative values, surrogates, values above U+10FFFF) because mb_chr() returns false and it was silently cast to string. It now throws Str\Exception\OutOfBoundsException.
Str\from_code_points() had a hand-rolled UTF-8 encoder that silently produced invalid byte sequences; encoding surrogates, wrapping out-of-range values via modulo, and accepting negative inputs. The implementation has been replaced with a simple loop over Str\chr(), making both functions fully consistent. Invalid code points now throw Str\Exception\OutOfBoundsException.
use Psl\Str;
// These all threw no error before, now they throw OutOfBoundsException:
Str\chr(-1);
Str\chr(0xD800); // surrogate
Str\chr(0x110000); // above Unicode max
Str\from_code_points(72, 0xD800, 111); // throws on the surrogateValid inputs are unaffected — chr() and from_code_points() produce identical output for all valid Unicode code points (U+0000..U+D7FF, U+E000..U+10FFFF).
Explicit function resolution across the codebase
All ambiguous function calls have been made explicit. Every call site now uses either a use function import for global PHP functions or namespace\foo() for same-namespace functions.
Documentation
Str\width(),Str\truncate(), andStr\width_slice()PHPDoc now explicitly states that width is defined bymb_strwidth()/mb_strimwidth(), and cross-references related functions likeStr\length(),Str\Grapheme\length(), andStr\Grapheme\slice().
Testing
- The H2 rate limiter window-reset test is now skipped on Windows, where
usleep()resolution is too coarse for sub-millisecond timing assertions.