Python character encoding detector
Universal character encoding detector. chardet 7 is a ground-up, 0BSD-licensed rewrite of chardet. Same package name, same public API — drop-in replacement for chardet 5.x/6.x, just much faster and more accurate. Python 3.10+, zero runtime dependencies, works on PyPy.
Read more details about the rewrite process.
99.7% accuracy on 3,138 test files. 315x faster than chardet 6.0.0, and +13.1pp more accurate than charset-normalizer 3.5.1 while being 1.2x faster. Language detection for every result. MIME type detection for binary files. 0BSD licensed.
Large inputs don't need a byte cap: detect(data, max_bytes=len(data)) on a
272 MiB file finishes in about 0.13-0.23s, and the UTF-8 verdict is validated
over every byte examined, never sampled. See
the performance docs
for the full large-input tables.
| chardet 7.6.1.dev (compiled) | chardet 6.0.0 | charset-normalizer 3.5.1 | |
|---|---|---|---|
| Accuracy (3,138 files) | 99.7% | 84.4% | 86.6% |
| Speed | 2,641 files/s (641 pure) | 9 files/s | 2,250 files/s |
| Language detection | 91.8% | 38.7% | 54.8% |
| Peak memory | 27.7 MiB | n/a | 71.0 MiB |
| Streaming detection | yes | yes | no |
| Encoding era filtering | yes | no | no |
| Encoding filters | yes | no | yes |
| MIME type detection | yes | no | no |
| Supported encodings | 99 | 84 | 99 |
| License | 0BSD | LGPL | MIT |
pip install chardet
…
For large files or network streams, use UniversalDetector to feed data incrementally:
from chardet import UniversalDetector
detector = UniversalDetector()
with open("unknown.txt", "rb") as f:
for line in f:
detector.feed(line)
if detector.done:
break
result = detector.close()
print(result)
Restrict detection to specific encoding eras to reduce false positives:
…
Restrict detection to specific encodings, or exclude encodings you don't want:
# Only consider UTF-8 and Windows-1252
chardet.detect(data, include_encodings=["utf-8", "windows-1252"])
# Consider everything except EBCDIC
chardet.detect(data, exclude_encodings=["cp037", "cp500"])
chardetect somefile.txt
# somefile.txt: utf-8 with confidence 0.99
chardetect --minimal somefile.txt
# utf-8
# Include detected language
chardetect -l somefile.txt
# somefile.txt: utf-8 en (English) with confidence 0.99
# Only consider specific encodings
chardetect -i utf-8,windows-1252 somefile.txt
# somefile.txt: utf-8 with confidence 0.99
# Pipe from stdin
cat somefile.txt | chardetect
# stdin: utf-8 with confidence 0.99
text/html, text/xml, and text/x-python for markupinclude_encodings and exclude_encodings parameters to restrict or exclude specific encodings from the candidate setdetect() and detect_all() are safe to call concurrently; scales on free-threaded Pythondetect(), detect_all(), UniversalDetector, and the chardetect CLI all work as beforeFull documentation is available at chardet.readthedocs.io.
chardet was originally created by Mark Pilgrim in 2006 as a Python port of Mozilla's universal charset detection library. He released versions 1.0 (2006) and 1.0.1 (2008) on PyPI, then developed an unreleased Python 3 port (2.0.1) on Google Code. After Mark deleted his online accounts in 2011, the project was continued by David Cramer, Erik Rose, Toshio Kuratomi, Ian Cordasco, and Dan Blanchard.
In 2026, Dan Blanchard rewrote chardet using Claude, releasing chardet 7.0
under a new license. All releases after 7 are not derivative of the original
chardet code, but are released under the same name to allow an easier
transition for users who can immediately benefit from the speed and accuracy
improvements. For historical preservation and to allow easier comparison with
the other releases, Dan has restored Mark's lost commits to this repository
in the history/pilgrim branch.
To see the full history from 2006 to present in git log, fetch the graft
refs:
git fetch origin 'refs/replace/*:refs/replace/*'
No open issues yet, or sync has not completed.