charset_normalizer

Frameworks & LibrariesMIT

charset_normalizer release notes.

Latest 3.5.1 · by charset_normalizerWritten in PythonWebsitejawah/charset_normalizerRSS

Release activity

Release activity — 8 releases across 8 days in the last year. Each cell is one day; darker means more releases that day. Older weeks are hidden at this screen width.
JunJulAugSep
SundayNo releases on May 24, 2026No releases on May 31, 2026No releases on Jun 7, 2026No releases on Jun 14, 2026No releases on Jun 21, 2026No releases on Jun 28, 2026No releases on Jul 5, 2026No releases on Jul 12, 2026No releases on Jul 19, 2026No releases on Jul 26, 2026No releases on Aug 2, 2026No releases on Aug 9, 2026No releases on Aug 16, 2026No releases on Aug 23, 2026No releases on Aug 30, 2026No releases on Sep 6, 2026
MondayNo releases on May 25, 2026No releases on Jun 1, 2026No releases on Jun 8, 2026No releases on Jun 15, 2026No releases on Jun 22, 2026No releases on Jun 29, 20261 release on Jul 6, 2026No releases on Jul 13, 2026No releases on Jul 20, 2026No releases on Jul 27, 2026No releases on Aug 3, 2026No releases on Aug 10, 2026No releases on Aug 17, 2026No releases on Aug 24, 2026No releases on Aug 31, 2026No releases on Sep 7, 2026
TuesdayNo releases on May 26, 2026No releases on Jun 2, 2026No releases on Jun 9, 2026No releases on Jun 16, 2026No releases on Jun 23, 2026No releases on Jun 30, 20261 release on Jul 7, 2026No releases on Jul 14, 2026No releases on Jul 21, 2026No releases on Jul 28, 2026No releases on Aug 4, 2026No releases on Aug 11, 2026No releases on Aug 18, 2026No releases on Aug 25, 2026No releases on Sep 1, 2026No releases on Sep 8, 2026
WednesdayNo releases on May 27, 2026No releases on Jun 3, 2026No releases on Jun 10, 2026No releases on Jun 17, 2026No releases on Jun 24, 2026No releases on Jul 1, 2026No releases on Jul 8, 2026No releases on Jul 15, 2026No releases on Jul 22, 2026No releases on Jul 29, 2026No releases on Aug 5, 20261 release on Aug 12, 2026No releases on Aug 19, 2026No releases on Aug 26, 2026No releases on Sep 2, 2026No releases on Sep 9, 2026
ThursdayNo releases on May 28, 2026No releases on Jun 4, 2026No releases on Jun 11, 2026No releases on Jun 18, 2026No releases on Jun 25, 2026No releases on Jul 2, 2026No releases on Jul 9, 2026No releases on Jul 16, 2026No releases on Jul 23, 2026No releases on Jul 30, 2026No releases on Aug 6, 2026No releases on Aug 13, 2026No releases on Aug 20, 2026No releases on Aug 27, 2026No releases on Sep 3, 2026
FridayNo releases on May 29, 2026No releases on Jun 5, 2026No releases on Jun 12, 2026No releases on Jun 19, 2026No releases on Jun 26, 2026No releases on Jul 3, 2026No releases on Jul 10, 2026No releases on Jul 17, 2026No releases on Jul 24, 2026No releases on Jul 31, 2026No releases on Aug 7, 2026No releases on Aug 14, 2026No releases on Aug 21, 2026No releases on Aug 28, 2026No releases on Sep 4, 2026
SaturdayNo releases on May 30, 2026No releases on Jun 6, 2026No releases on Jun 13, 2026No releases on Jun 20, 2026No releases on Jun 27, 2026No releases on Jul 4, 2026No releases on Jul 11, 2026No releases on Jul 18, 2026No releases on Jul 25, 2026No releases on Aug 1, 2026No releases on Aug 8, 20261 release on Aug 15, 2026No releases on Aug 22, 2026No releases on Aug 29, 2026No releases on Sep 5, 2026

8 releases in the last year

Changelog

3.5.1Latest

Version 3.5.1

Changed 2
  • Raise upper bound of setuptools to v84
  • Optimize cache performance access for CharInfo struct in prebuilt versions
Fixed 1
  • No longer decode large content when the noise detector output gives high entropy for inputs larger than 1M bytes

From charset_normalizer

Changed
  • Raised upper bound of setuptools to v84 (#794)
  • Cache performance access optimization for our CharInfo struct (prebuilt only).
Fixed
  • No longer decoding large content when the noise detector output give a high entropy. Only impacted large content input >1M bytes.
View originalPermalink
How 3.5.1 went
3.5.0

Version 3.5.0

Added 1
  • Explicit support for Python 3.15
Changed 3
  • Replaced the optional mypyc build with Cython extensions while retaining the pure Python fallback
  • Applied micro-optimization on several utils
  • CharsetMatches no longer sort on each match insertion
Fixed 4
  • Comparing a CharsetMatch to a non-alias encoding strings
  • Return 0.0 CharsetMatch.multi_byte_usage for empty payloads instead of crashing
  • A file with both a charset declaration and BOM/SIG did not verify first the BOM/SIG charset
  • iso2022* cases misdetected due to a flaw in multibyte chunking logic

From charset_normalizer

3.5.0 (2026-08-12)
Added
  • Explicit support for Python 3.15
Fixed
  • Comparing a CharsetMatch to a non-alias encoding strings (#773)
  • Return 0.0 CharsetMatch.multi_byte_usage for empty payloads instead of crashing (#774)
  • A file with both a charset declaration and BOM/SIG did not verify first the BOM/SIG charset.
  • iso2022* cases misdetected due to a flaw in our multibyte chunking logic.
Changed
  • Replaced the optional mypyc build with Cython extensions while retaining the pure Python fallback. The previous engine (mypyc) started to hit rough limit around the optimization of our noise/coherence detector while Cython allows us to steer the engine toward the right generated optimized sources. This change SHOULD not impact bundler (e.g. Pyinstaller) as the module are immediately discoverable (i.e. not hidden import like mypyc did). Moreover, a long wished distribution is the abi3 wheels, this will allow us to no longer rush each year when a new Python interpreter is released. We still distribute the interpreter specific wheels for faster performance.
  • Applied micro-optimization on several utils.
  • CharsetMatches no longer sort on each match insertion.
Misc
  • Removed an old performance optimization attempt in apy.py (success_fast_tracked+payload_result_cache).
View originalPermalink
How 3.5.0 went
3.4.9

Version 3.4.9

Fixed 1
  • Regression in fallback path leading to a decode error

From charset_normalizer

Fixed
  • Regression in our fallback path leading to a decode error. (#771) We've yanked 3.4.8 as a result of that bug.
View originalPermalink
How 3.4.9 went
3.4.8

Version 3.4.8

Changed 5
  • No longer holding a global cache for our noise / coherence measurements to relax RSS memory usage
  • Micro-optimizations in our noise / coherence measurements
  • No longer using regex search by default for our preemptive charset mark algorithm
  • Raised upperbound of setuptools to v83
  • Raised upperbound of mypy(c) to v2.1
Fixed 3
  • Wall import time due to cascade codec imports for our multibyte first sort of iana supported codecs
  • Unnecessary json import at runtime
  • Inverse capitalization not seen by noise detector
Removed 1
  • Redundant UTF7 BOM marker

From charset_normalizer

3.4.8 (2026-07-06)
Fixed
  • Wall import time due to cascade codec imports for our multibyte first sort of iana supported codecs (#742)
  • Unnecessary json import at runtime (#753)
  • Inverse capitalization not seen by noise detector (#731)
Changed
  • No longer holding a global cache for our noise / coherence measurements. Relax RSS memory usage.
  • Micro-optimizations in our noise / coherence measurements.
  • No longer using regex search by default for our preemptive charset mark algorithm.
  • Raised upperbound of setuptools to v83.
  • Raised upperbound of mypy(c) to v2.1.
Removed
  • Redundant UTF7 BOM marker (#730)
View originalPermalink
How 3.4.8 went
3.4.7

Version 3.4.7

Changed 2
  • Pre-built optimized version using mypy[c] v1.20
  • Relax setuptools constraint to setuptools>=68,<82.1
Fixed 1
  • Correctly remove SIG remnant in utf-7 decoded string

From charset_normalizer

Changed
  • Pre-built optimized version using mypy[c] v1.20.
  • Relax setuptools constraint to setuptools>=68,<82.1.
Fixed
  • Correctly remove SIG remnant in utf-7 decoded string. (#718) (#716)
View originalPermalink
How 3.4.7 went
3.4.6

Version 3.4.6

Changed 3
  • Flatten the logic in charset_normalizer.md for higher performance by removing eligible(..) and feed(...) in favor of feed_info(...)
  • Raise upper bound for mypy[c] to 1.20 for the optimized version
  • Update UNICODE_RANGES_COMBINED using Unicode blocks v17
Fixed 2
  • Fix edge case where noise difference between two candidates can be almost insignificant
  • Fix CLI --normalize writing to wrong path when passing multiple files in

From charset_normalizer

3.4.6 (2026-03-15)
Changed
  • Flattened the logic in charset_normalizer.md for higher performance. Removed eligible(..) and feed(...) in favor of feed_info(...).
  • Raised upper bound for mypy[c] to 1.20, for our optimized version.
  • Updated UNICODE_RANGES_COMBINED using Unicode blocks v17.
Fixed
  • Edge case where noise difference between two candidates can be almost insignificant. (#672)
  • CLI --normalize writing to wrong path when passing multiple files in. (#702)
Misc
  • Freethreaded pre-built wheels now shipped in PyPI starting with 3.14t. (#616)
View originalPermalink
How 3.4.6 went
3.4.5

Version 3.4.5

Changed 5
  • Update setuptools constraint to setuptools>=68,<=82
  • Raised upper bound of mypyc for the optional pre-built extension to v1.19.1
  • Applied safe micro-optimizations in noise detector and language detector
  • Rewrote the query_yes_no function inside CLI to avoid using ambiguous licensed code
  • Added cd.py submodule into mypyc optional compilation to reduce performance impact
Fixed 3
  • Add explicit link to lib math in optimized build
  • Logger level not restored correctly for empty byte sequences
  • TypeError when passing bytearray to from_bytes

From charset_normalizer

3.4.5 (2026-03-06)
Changed
  • Update setuptools constraint to setuptools>=68,<=82.
  • Raised upper bound of mypyc for the optional pre-built extension to v1.19.1
Fixed
  • Add explicit link to lib math in our optimized build. (#692)
  • Logger level not restored correctly for empty byte sequences. (#701)
  • TypeError when passing bytearray to from_bytes. (#703)
Misc
  • Applied safe micro-optimizations in both our noise detector and language detector.
  • Rewrote the query_yes_no function (inside CLI) to avoid using ambiguous licensed code.
  • Added cd.py submodule into mypyc optional compilation to reduce further the performance impact.

[!WARNING]
mypyc changed the usual binary output for the optimized wheel. Beware, especially if using PyInstaller or alike. See https://github.com/jawah/charset_normalizer/issues/714

View originalPermalink
How 3.4.5 went
3.4.4

Version 3.4.4

Added 1
  • Add pre-built wheels for riscv64, s390x, and armv7l architectures
Changed 2
  • Bound setuptools to a specific constraint setuptools>=68,<=81
  • Raised upper bound of mypyc for the optional pre-built extension to v1.18.2
Removed 1
  • Remove setuptools-scm as a build dependency

From charset_normalizer

3.4.4 (2025-10-13)
Changed
  • Bound setuptools to a specific constraint setuptools>=68,<=81.
  • Raised upper bound of mypyc for the optional pre-built extension to v1.18.2
Removed
  • setuptools-scm as a build dependency.
Misc
  • Enforced hashes in dev-requirements.txt and created ci-requirements.txt for security purposes.
  • Additional pre-built wheels for riscv64, s390x, and armv7l architectures.
  • Restore multiple.intoto.jsonl in GitHub releases in addition to individual attestation file per wheel.
View originalPermalink
How 3.4.4 went
3.4.3

Version 3.4.3

Added 2
  • Custom build backend to overcome inability to mark mypy as an optional dependency in the build phase
  • Support for Python 3.14
Changed 2
  • mypy(c) is no longer a required dependency at build time if CHARSET_NORMALIZER_USE_MYPYC isn't set to 1
  • automatically lower confidence on small bytes samples that are not Unicode in detect output legacy function
Fixed 2
  • sdist archive contained useless directories
  • automatically fallback on valid UTF-16 or UTF-32 even if the md says it's noisy

From charset_normalizer

3.4.3 (2025-08-09)
Changed
  • mypy(c) is no longer a required dependency at build time if CHARSET_NORMALIZER_USE_MYPYC isn't set to 1. (#595) (#583)
  • automatically lower confidence on small bytes samples that are not Unicode in detect output legacy function. (#391)
Added
  • Custom build backend to overcome inability to mark mypy as an optional dependency in the build phase.
  • Support for Python 3.14
Fixed
  • sdist archive contained useless directories.
  • automatically fallback on valid UTF-16 or UTF-32 even if the md says it's noisy. (#633)
Misc
  • SBOM are automatically published to the relevant GitHub release to comply with regulatory changes. Each published wheel comes with its SBOM. We choose CycloneDX as the format.
  • Prebuilt optimized wheel are no longer distributed by default for CPython 3.7 due to a change in cibuildwheel.
View originalPermalink
How 3.4.3 went
3.4.2

Version 3.4.2

Changed 1
  • Upgrade optional mypyc compilation to version 1.15 for Python >= 3.9
Fixed 2
  • Address the DeprecationWarning in the CLI regarding argparse.FileType by backporting the target class into the package
  • Improve the overall reliability of the detector with CJK Ideographs

From charset_normalizer

3.4.2 (2025-05-02)
Fixed
  • Addressed the DeprecationWarning in our CLI regarding argparse.FileType by backporting the target class into the package. (#591)
  • Improved the overall reliability of the detector with CJK Ideographs. (#605) (#587)
Changed
  • Optional mypyc compilation upgraded to version 1.15 for Python >= 3.9
View originalPermalink
How 3.4.2 went
3.4.1

Version 3.4.1

Added 2
  • Add pre-commit configuration
  • Add noxfile
Changed 3
  • Project metadata are now stored using pyproject.toml instead of setup.cfg using setuptools as the build backend
  • Enforce annotation delayed loading for a simpler and consistent types in the project
  • Optional mypyc compilation upgraded to version 1.14 for Python >= 3.8
Fixed 2
  • Converting content to Unicode bytes may insert utf_8 instead of preferred utf-8
  • Fix deprecation warning 'count' is passed as positional argument when converting to Unicode bytes on Python 3.13+
Removed 4
  • Remove build-requirements.txt in favor of using pyproject.toml native build configuration
  • Remove bin/integration.py and bin/serve.py in favor of downstream integration test
  • Remove setup.cfg in favor of pyproject.toml metadata configuration
  • Remove unused utils.range_scan function

From charset_normalizer

🚀 We're still raising awareness around HTTP/2, and HTTP/3!

Did you know that Internet Explorer 11 shipped with an optional HTTP/2 support back in 2013? also libcurl did ship it in 2014[...] Using Requests today is the rough equivalent of using EOL Windows 8! We promptly invite Python developers to look at the first drop-in replacement for Requests, namely Niquests. Ship with native WebSocket, SSE, Happy Eyeballs, DNS over HTTPS, and so on[...] All of this while remaining compatible with all Requests prior plug-ins / add-ons.

It leverages charset-normalizer in a better way! Check it out, you will gain up to being 3X faster and get a real/respectable support with it.

3.4.1 (2024-12-24)
Changed
  • Project metadata are now stored using pyproject.toml instead of setup.cfg using setuptools as the build backend.
  • Enforce annotation delayed loading for a simpler and consistent types in the project.
  • Optional mypyc compilation upgraded to version 1.14 for Python >= 3.8
Added
  • pre-commit configuration.
  • noxfile.
Removed
  • build-requirements.txt as per using pyproject.toml native build configuration.
  • bin/integration.py and bin/serve.py in favor of downstream integration test (see noxfile).
  • setup.cfg in favor of pyproject.toml metadata configuration.
  • Unused utils.range_scan function.
Fixed
  • Converting content to Unicode bytes may insert utf_8 instead of preferred utf-8. (#572)
  • Deprecation warning "'count' is passed as positional argument" when converting to Unicode bytes on Python 3.13+
View originalPermalink
How 3.4.1 went
3.4.0

Version 3.4.0

Added 2
  • Argument --no-preemptive in the CLI to prevent the detector to search for hints
  • Support for Python 3.13
Fixed 3
  • Relax the TypeError exception thrown when trying to compare a CharsetMatch with anything else than a CharsetMatch
  • Improve the general reliability of the detector based on user feedbacks
  • Declared charset in content (preemptive detection) not changed when converting to utf-8 bytes

From charset_normalizer

🚀 charset-normalizer is raising awareness around HTTP/2, and HTTP/3!

Did you know that Internet Explorer 11 shipped with an optional HTTP/2 support back in 2013? also libcurl did ship it in 2014[...] All of this while our community is still struggling to make a firm advancement in HTTP clients. Now, many of you use Requests as the defacto http client, now, and for many years now, Requests has been frozen. Being left in a vegetative state and not evolving, this blocked millions of developers from using more advanced features.

We promptly invite Python developers to look at the drop-in replacement for Requests, namely Niquests. It leverage charset-normalizer in a better way! Check it out, you will be positively surprised! Don't wait another decade.

We are thankful to @microsoft and involved parties for funding our work through the Microsoft FOSS Fund program.

3.4.0 (2024-10-08)
Added
  • Argument --no-preemptive in the CLI to prevent the detector to search for hints.
  • Support for Python 3.13 (#512)
Fixed
  • Relax the TypeError exception thrown when trying to compare a CharsetMatch with anything else than a CharsetMatch.
  • Improved the general reliability of the detector based on user feedbacks. (#520) (#509) (#498) (#407) (#537)
  • Declared charset in content (preemptive detection) not changed when converting to utf-8 bytes. (#381)
View originalPermalink
How 3.4.0 went
View all

Discussion

If you publish charset_normalizer, you can claim this product by proving you administer its repository.