unstale

pypi / charset-normalizer

charset-normalizer

What changed in charset-normalizer 3, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-17.

5 breaking4 performance2 behavior and defaults4 tooling14 fixes and other

See which of these apply to your code, ranked, in your agent:

npx @unstale/cli init

@unstale/cli 0.1.0 on npm

charset-normalizer 329 changes

Breaking changes 5

  • Large content with high-entropy noise detector output is no longer decoded, affecting inputs larger than 1M bytes.

    3.5.1release notes

  • Files containing both a charset declaration and BOM/SIG now verify the BOM/SIG charset first.

    3.5.0release notes

  • Removed in favor of feed_info, requiring callers to use the replacement API.

    3.4.6release notes

  • Removed in favor of feed_info, requiring callers to use the replacement API.

    3.4.6release notes

  • Replaces eligible and feed as the preferred API for the flattened logic.

    3.4.6release notes

Performance 4

  • CharsetMatches no longer sort on each match insertion, reducing repeated sorting work.

    3.5.0release notes

  • Cascade codec imports were changed to reduce wall import time.

    3.4.8release notes

  • Measurements no longer use a global cache, reducing RSS memory usage.

    3.4.8release notes

  • Noise and coherence measurements received micro-optimizations.

    3.4.8release notes

Behavior and default changes 2

  • The algorithm no longer uses regex search by default.

    3.4.8release notes

  • Updated using Unicode blocks v17, changing the Unicode range data used by charset detection.

    3.4.6release notes

Tooling 4

  • The Cython upper bound is now <3.4 for native builds; abi3 builds remain capped below 3.3 for Python 3.7 Limited API compatibility.

    3.5.2release notes

  • abi3 wheels are now distributed, reducing the need to rush releases for new Python interpreters.

    3.5.0release notes

  • Optional mypyc builds were replaced with Cython extensions while retaining the pure Python fallback.

    3.5.0release notes

  • Pre-built freethreaded wheels are now shipped in PyPI for freethreaded Python environments.

    3.4.6release notes

Fixes and other changes 14

  • Supported encodings without aliases now resolve correctly and are no longer ignored in charset declarations.

    3.5.2release notes

  • Valid UTF-8 Chinese JSON is no longer incorrectly detected as PTCP154 because of excessive noise penalties for uncommon CJK characters.

    3.5.2release notes

  • Comparisons with non-alias encoding strings were fixed.

    3.5.0release notes

  • Empty payloads now return 0.0 instead of crashing.

    3.5.0release notes

  • Detection of iso2022* cases was corrected by fixing multibyte chunking logic.

    3.5.0release notes

  • Explicit support for Python 3.15 was added.

    3.5.0release notes

  • Fixed a regression in the fallback path that could lead to a decode error.

    3.4.9release notes

  • Inverse capitalization is now recognized by the noise detector.

    3.4.8release notes

  • The redundant UTF7 BOM marker was removed.

    3.4.8release notes

  • Correctly removes the SIG remnant from utf-7 decoded strings.

    3.4.7release notes

  • Fixed an edge case where noise differences between candidates could be almost insignificant.

    3.4.6release notes

  • Fixed writing to the wrong path when normalizing multiple files.

    3.4.6release notes

  • Passing a bytearray to from_bytes no longer raises TypeError.

    3.4.5release notes

  • Logger levels are restored correctly when processing empty byte sequences.

    3.4.5release notes