# What changed in charset-normalizer

> 29 changes in charset-normalizer 3 from its official release notes, upgrade guides and advisories: 5 breaking. Each one cited. Sources checked 2026-10-17. HTML: https://unstale.sh/pypi/charset-normalizer/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## charset-normalizer 3

### Breaking changes

- Large content with high-entropy noise detector output is no longer decoded, affecting inputs larger than 1M bytes. (3.5.1) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.5.1)
- Files containing both a charset declaration and BOM/SIG now verify the BOM/SIG charset first. (3.5.0) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.5.0)
- Removed in favor of feed_info, requiring callers to use the replacement API. (3.4.6) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.4.6)
- Removed in favor of feed_info, requiring callers to use the replacement API. (3.4.6) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.4.6)
- Replaces eligible and feed as the preferred API for the flattened logic. (3.4.6) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.4.6)

### Performance

- CharsetMatches no longer sort on each match insertion, reducing repeated sorting work. (3.5.0) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.5.0)
- Cascade codec imports were changed to reduce wall import time. (3.4.8) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.4.8)
- Measurements no longer use a global cache, reducing RSS memory usage. (3.4.8) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.4.8)
- Noise and coherence measurements received micro-optimizations. (3.4.8) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.4.8)

### Behavior and default changes

- The algorithm no longer uses regex search by default. (3.4.8) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.4.8)
- Updated using Unicode blocks v17, changing the Unicode range data used by charset detection. (3.4.6) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.4.6)

### Tooling

- 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.2) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.5.2)
- abi3 wheels are now distributed, reducing the need to rush releases for new Python interpreters. (3.5.0) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.5.0)
- Optional mypyc builds were replaced with Cython extensions while retaining the pure Python fallback. (3.5.0) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.5.0)
- Pre-built freethreaded wheels are now shipped in PyPI for freethreaded Python environments. (3.4.6) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.4.6)

### Fixes and other changes

- Supported encodings without aliases now resolve correctly and are no longer ignored in charset declarations. (3.5.2) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.5.2)
- Valid UTF-8 Chinese JSON is no longer incorrectly detected as PTCP154 because of excessive noise penalties for uncommon CJK characters. (3.5.2) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.5.2)
- Comparisons with non-alias encoding strings were fixed. (3.5.0) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.5.0)
- Empty payloads now return 0.0 instead of crashing. (3.5.0) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.5.0)
- Detection of iso2022* cases was corrected by fixing multibyte chunking logic. (3.5.0) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.5.0)
- Explicit support for Python 3.15 was added. (3.5.0) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.5.0)
- Fixed a regression in the fallback path that could lead to a decode error. (3.4.9) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.4.9)
- Inverse capitalization is now recognized by the noise detector. (3.4.8) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.4.8)
- The redundant UTF7 BOM marker was removed. (3.4.8) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.4.8)
- Correctly removes the SIG remnant from utf-7 decoded strings. (3.4.7) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.4.7)
- Fixed an edge case where noise differences between candidates could be almost insignificant. (3.4.6) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.4.6)
- Fixed writing to the wrong path when normalizing multiple files. (3.4.6) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.4.6)
- Passing a bytearray to from_bytes no longer raises TypeError. (3.4.5) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.4.5)
- Logger levels are restored correctly when processing empty byte sequences. (3.4.5) — [release notes](https://github.com/jawah/charset_normalizer/releases/tag/3.4.5)
