一个帮助您从未知字符集编码中读取文本的库。
受chardet启发,我试图通过新的方法来解决这个问题。 支持 Python 核心库提供编解码器的所有 IANA 字符集名称。
>>>>> 立即在线试用,然后采纳我 👈 <<<<<
此项目为您提供了 通用字符集编码检测器(也称为 Chardet)的替代方案。
| 功能 | Chardet | Charset Normalizer | cChardet |
|---|---|---|---|
快速 |
❌ | ✅ | ✅ |
通用** |
❌ | ✅ | ❌ |
可靠 无可区分标准 |
❌ | ✅ | ✅ |
可靠 有可区分标准 |
✅ | ✅ | ✅ |
许可证 |
LGPL-2.1 限制性 |
MIT | MPL-1.1 限制性 |
纯 Python |
✅ | ✅ | ❌ |
检测口语 |
❌ | ✅ | N/A |
UnicodeDecodeError 安全 |
❌ | ✅ | ❌ |
Whl 大小(最小) |
193.6 kB | 42 kB | ~200 kB |
支持的编码 |
33 | 🎉 99 | 40 |
** : 它们显然使用了针对特定编码的特定代码,即使覆盖了大多数常用编码
此包的性能优于其对应项 Chardet。以下是一些数据。
| 包 | 准确率 | 每文件平均(毫秒) | 每秒文件(估计) |
|---|---|---|---|
| chardet | 86 % | 63 毫秒 | 16 文件/秒 |
| charset-normalizer | 98 % | 10 毫秒 | 100 文件/秒 |
| 包 | 99% 分位数 | 95% 分位数 | 50% 分位数 |
|---|---|---|---|
| chardet | 265 毫秒 | 71 毫秒 | 7 毫秒 |
| charset-normalizer | 100 毫秒 | 50 毫秒 | 5 毫秒 |
截至 2024 年 12 月使用 CPython 3.12 更新
Chardet 对大文件(1MB+)的性能非常差。在大负载下,预期会有巨大差异。
统计数据是使用 400+ 个文件并使用默认参数生成的。有关使用文件的更多详细信息,请参阅 GHA 工作流程。 是的,这些结果可能随时更改。数据集可能会更新以包含更多文件。 实际延迟很大程度上取决于您的 CPU 能力。这些因素应该保持不变。 请注意,统计数据是慷慨的,并且 Chardet 的准确性与我们的准确性是使用 Chardet 的初始能力(例如,支持的编码)来衡量的。如果您愿意,可以挑战它们。
使用 pip:
pip install charset-normalizer -U此包附带一个 CLI。
usage: normalizer [-h] [-v] [-a] [-n] [-m] [-r] [-f] [-t THRESHOLD]
file [file ...]
The Real First Universal Charset Detector. Discover originating encoding used
on text file. Normalize text to unicode.
positional arguments:
files 要分析的文件
optional arguments:
-h, --help 显示此帮助消息并退出
-v, --verbose 显示有关文件的补充信息(如果有)。
标准输出将包含有关检测过程的日志。
-a, --with-alternative
输出任何补充的可能性。顶级
JSON 将是一个列表。
-n, --normalize 允许规范化输入文件。如果未设置,程序
不会写任何内容。
-m, --minimal 仅将检测到的字符集输出到 STDOUT。禁用
JSON 输出。
-r, --replace 尝试规范化文件时替换文件,而不是
创建新文件。
-f, --force 在不询问的情况下替换文件,请谨慎使用此标志。
-t THRESHOLD, --threshold THRESHOLD
定义可允许的已解码内容中的最大混乱度。
0. <= chaos <= 1.
--version 显示版本信息并退出。
normalizer ./data/sample.1.fr.srt或
python -m charset_normalizer ./data/sample.1.fr.srt🎉 自 1.4.0 版本起,CLI 可在 JSON 格式中产生易于使用的 stdout 结果。
{
"path": "/home/default/projects/charset_normalizer/data/sample.1.fr.srt",
"encoding": "cp1252",
"encoding_aliases": [
"1252",
"windows_1252"
],
"alternative_encodings": [
"cp1254",
"cp1256",
"cp1258",
"iso8859_14",
"iso8859_15",
"iso8859_16",
"iso8859_3",
"iso8859_9",
"latin_1",
"mbcs"
],
"language": "French",
"alphabets": [
"Basic Latin",
"Latin-1 Supplement"
],
"has_sig_or_bom": false,
"chaos": 0.149,
"coherence": 97.152,
"unicode_path": null,
"is_preferred": true
}只需打印出规范化后的文本
from charset_normalizer import from_path
results = from_path('./my_subtitle.srt')
print(str(results.best()))轻松升级您的代码
from charset_normalizer import detect上面的代码将与 chardet 的行为相同。我们确保提供尽可能好的(合理的)向后兼容结果。
有关高级用法,请参阅文档:readthedocs.io
当我开始使用 Chardet 时,我注意到它不符合我的期望,我想提出一个 使用完全不同方法的可靠替代方案。还有!我从不退缩于一项艰巨的挑战!
我不在乎原始字符集编码,因为 两个不同的表格 可以生成两个相同的渲染字符串。 我想要的是得到可读的文本,尽我所能。
某种程度上,我是在暴力破解文本解码。 这是不是很酷?😎
不要将包 ftfy 与 charset-normalizer 或 chardet 混淆。ftfy 的目标是修复 Unicode 字符串,而 charset-normalizer 的目标是将未知编码的原始文件转换为 unicode。
- 丢弃所有不适合二进制内容的所有字符集编码表。
- 测量噪声,或者在(按块)使用相应字符集编码打开后的混乱程度。
- 提取具有最低噪声的匹配项。
- 此外,我们还可以测量连贯性/探测语言。
等一下,噪声/混乱和连贯性根据您的定义是什么?
噪声: 我打开了成百上千份文本文件,由人类编写,使用了错误的编码表。 我观察了,然后我制定了一些关于什么显而易见的规则,当看起来像是一团糟(即,定义渲染文本中的噪声)时。 我知道我对噪声的解释可能不完整,如果您愿意,可以随时贡献以改进或重写它。
连贯性: 对于地球上的每种语言,我们都计算了排名靠前的字母出现频率(尽我们所能)。所以我认为这里的智能设计有价值。所以我将这些记录与解码后的文本进行对比,以检查我是否能检测到智能设计。
- 当文本包含两种或两种以上共享相同字母的语言时,语言检测是不可靠的(例如,HTML(英文标签)+ 土耳其语内容(共享拉丁字符))。
- 每个字符集检测器都严重依赖于足够的内容。在常见情况下,请不要对非常小的内容运行检测。
如果您正在运行:
- Python >=2.7,<<3.5:不支持
- Python 3.5:charset-normalizer < 2.1
- Python 3.6:charset-normalizer < 3.1
- Python 3.7:charset-normalizer < 4.0
请尽快升级您的 Python 解释器。
非常欢迎贡献、问题和功能请求。
如果您想做出贡献,请随时查看问题页面。
版权所有 © Ahmed TAHRI @Ousret。
本项目采用MIT许可证。
本项目中使用的字符频率 © 2012 Denny Vrandečić
charset-normalizer 的专业支持可通过Tidelift Subscription获得。Tidelift 为软件开发团队提供了一个单一的来源,用于购买和维护其软件,并提供来自最了解它的专家的专业级保障,同时与现有工具无缝集成。

