0.75 2026-07-14 - Fixed slurp_utf8() leaking the file descriptor if a fatal "utf8" warning (e.g. warnings FATAL => 'utf8') was thrown while reading an ill-formed file. 0.74 2026-07-13 - Fixed slurp_utf8() failing to link on Windows: PerlIO_openn is not exported there. The file is now opened with the unbuffered PerlLIO fd wrappers (open3/fstat/read/close) instead. 0.73 2026-07-13 - Added slurp_utf8($filename) which reads an entire file and returns its contents decoded from UTF-8 as a character string. - Added support for older MSVC C compilers by using __inline in place of the C99 inline keyword on pre-Visual Studio 2015 builds. - Fixed SSE2 detection to only enable the SIMD implementation on 64-bit x86 targets. This prevents unsupported SSE2 code from being selected on 32-bit x86 builds. Reported by Paul Howarth (@pghmcfc) issue #14. 0.72 2026-07-07 - read_utf8() now takes a single-pass fast path on PerlIO fast-gets layers, validating/copying/counting straight out of the layer buffer (up to ~11% faster on multibyte-heavy input; see benchmarks/). - Fixed read_utf8() on non-buffered handles stranding the trailing incomplete sequence that was read to satisfy the requested length: the pending bytes are now pushed back with PerlIO_unread() so the following read sees them, matching decode_utf8() when drained to end of file. 0.71 2026-07-05 - Added read_utf8($fh, $buf, $length[, $offset]) for reading validated UTF-8 code points from a file handle. Bytes are validated as they are read using a streaming DFA validator, so no PerlIO encoding layer is required on the handle. Ill-formed and truncated sequences are replaced with U+FFFD per the maximal subpart rule and warned in the "utf8" category. Tied file handles are not supported. - Replaced the deprecated utf8n_to_uvuni() with utf8n_to_uvchr() thanks to James E Keenan (@keenan), PR #13. 0.70 2026-03-19 - Use utf8_check_ascii with a 16-byte ASCII fast path 0.69 2026-03-19 - Update the c-utf8 library code: Improved GCC code generation, including with -O2, resulting in higher throughput. 0.68 2026-03-02 - Include correct version of utf8_valid.h header. 0.67 2026-03-02 - Fix SIMD feature gating for x86; avoid SSE2 intrinsics on non-SSE2 i686 builds - Use Dist::Zilla for the distro (Thanks to Dan Book, @Grinnz++ for the migration) 0.66 2026-02-25 - Rewrote the UTF-8 validator using a shift-based DFA from https://github.com/chansen/c-utf8-valid by the same author. Benchmarks show up to 10x faster decoding compared to Encode.pm, see benchmarks/ in the repository for details. 0.65 2026-02-23 - C99-compliant compiler is now required for Unicode::UTF8. - Scan 16 bytes at a time to detect non-ASCII bytes, falling back to sequence validation for non-ASCII input. This approach resulted in a 900% throughput improvement on English text and a 200% improvement on Swedish text compared to Encode.pm. Benchmark in git repository. 0.64 2026-02-23 - Unicode::UTF8 now allows noncharacters; they receive no special handling and are processed like any other code point. According to Corrigendum #9, noncharacters (the values U+nFFFE and U+nFFFF (where n is from 0 to 10^16) and the values U+FDD0..U+FDEF) are permanently reserved but should be allowed in interchange. 0.63 2025-12-21 - Remove the non-portable tests for Perl's "super" code points, testing values beyond 0x7FFF_FFFF isn’t necessary. - Documentation typo corrections by @HuaChunbo 0.62 2017-04-11 - Only check for missing Module::Install related modules in Makefile.PL 0.61 2017-04-10 - Avoid relying on current working directory being in @INC - Documentation typo fixes by Andreas Guldstrand (COFFEE) 0.60 2013-09-24 - added valid_utf8() - skip copy-on-write tests on Perl 5.19 0.59 2013-03-28 - No functional changes in this release - 5.17.7 introduced a new copy-on-write mechanism which was disabled in 5.17.10 due too many rough edges. Skip one test if running on these Perl versions. http://search.cpan.org/dist/perl-5.17.10/pod/perldelta.pod#Internal_Changes 0.58 2012-12-15 - decode_utf8()/encode_utf8() now tries to avoid copying values returned from a subroutine, ARRAY functions (delete, pop, shift, splice) and HASH functions (delete). Following examples is zero-copy if the returned value is a string: - decode_utf8(function()); - decode_utf8(delete $hash{Key}); - deocde_utf8(shift @array); - Optimized decoding of upgraded octets. - Removed suffix "in UTF-8 encoding form" from warnings messages 0.57 2012-11-05 - Permit isolated usage of sub-categories non_unicode, nonchar and surrogate on Perl 5.14 or greater. 0.56 2012-11-04 - Added a third argument to $fallback, the position of octet/character at which the error occurred. 0.55 2011-12-22 - Fixed an assertion failure that was triggered by Perl_sv_catpvn_flags() when perl was compiled with DEBUGGING. 0.54 2011-12-21 - Fixed a bug where GET magic would be triggered twice in decode_utf8 if the provided $octets scalar had the SvUTF8 flag turned on. - Clarified $fallback return values. 0.53 2011-11-23 - Previous release introduced a bug in utf8_skip(), fixed the bug and increased test coverage. 0.52 2011-11-22 - There are no functional changes introduced by this release. - Prefixed internal function names to avoid potential future name clashes. - Minor refactor of internal function utf8_skip(). - Added a CONFORMANCE section to POD. - Moved Encode.pm comparison to it's own section COMPARISON. 0.51 2011-11-10 - Implemented support for the nonchar, surrogate and non_unicode sub-categories of utf8 warning on Perl 5.14 or greater. 0.50 2011-11-04 - First stable release. API is declared as stable. Warning messages might undergo a few changes before 1.00 release. 0.01_11 2011-11-03 - Only use XSTARG on well-formed UTF-8 strings 0.01_10 2011-11-03 - Corrected POD commands and typos in documentation. 0.01_09 2011-11-03 - Implemented support for error-handling mechanism 0.01_08 2011-10-18 - Refactored internal function utf8_check() for better performance 0.01_07 2011-10-11 - Fixed detection of non-shortest form UTF-X on perl versions <= 5.8.6 - Fixed utf8_length() invocation, don't pass the interpreter context - Shortened the Encode.pm comparison 0.01_06 2011-09-24 - Report character position in encode_utf8() warning messages - Added a comparison with Encode.pm 0.01_05 2011-09-20 - Correct maximal subpart implementation An initial subsequence of a ill-formed sequence is not maximal subpart. -> -> -> -> -> Unicode v6.0: D93b Maximal subpart of an ill-formed subsequence: The longest code unit subsequence starting at an unconvertible offset that is either: a. the initial subsequence of a well-formed code unit sequence, or b. a subsequence of length one. 0.01_04 2011-09-17 - croak if Perl's internal representation of wide characters is ill-formed. - Fixed a bug in replacement handling. - Added a test for replacement handling. 0.01_03 2011-09-16 - Removed the "Can't represent restricted code point" error, code points above U+10FFFF is reported as "Can't represent super code point". - Instead of just croaking use the 'utf8' warnings category and leave the choise of error reporting to the user. - Maximal subpart of an ill-formed subsequence is replaced with U+FFFD as recomended by Unicode. 0.01_02 2011-09-13 - Changed wording in encoding exception messages from "Can't map \w+ code point" to "Can't represent \w+ code point", - Added a taint test. - Added a leaks test. 0.01_01 2011-09-12 - Initial CPAN release.