编码检测
编码检测
HTML 以字节形式到达,编码层回答任何流水线的第一个问题:使用何种编码,以及得到什么文本?检测遵循标准方法——首先检查字节顺序标记(BOM),随后是内容内部的声明。
从字节检测
detect_encoding() 嗅探字节流并返回一个 EncodingDetectionResult,其中包含检测到的编码、置信度以及解码后的文本。一个 UTF-8 BOM 被确定为存在,并且在解码输出中会剥除 BOM 字节:
from aspose_html.encoding.detection import detect_encoding
result = detect_encoding(b"\xef\xbb\xbf<p>x</p>")
print(result.encoding)
print(result.confidence)
print(result.text)检测工具包
sniff_bom() 仅检查字节顺序标记;prescan_meta_charset() 对文档内部的字符集声明执行标准的元预扫描;decode_bytes() 在选择编码后执行解码。不支持的编码会抛出特定的 UnsupportedEncodingError。
规范名称
编码标签在实际使用中各不相同 — latin1、iso-8859-1 和 us-ascii 根据编码标准都表示 windows-1252。get_canonical_name() 将任何已注册的标签映射到其规范名称。
提示与最佳实践
- 信任 BOM:当其存在时,它是决定性的,检测器会报告确定的置信度
- 在比较编码之前,通过
get_canonical_name()规范化标签 - 使用检测得到的
result.text,而不是自行重新解码字节
常见问题
| 问题 | 原因 | 修复 |
|---|---|---|
| 在解码文本中出现 BOM | 手动解码而非 detect_encoding() | 检测会从 result.text 中去除 BOM 字节 |
| 标签比较失败 | 别名与规范名称不匹配 | 使用 get_canonical_name() 进行归一化 |
抛出 UnsupportedEncodingError | 输入编码不在注册表中 | 处理已键入的错误;向上游重新编码 |
FAQ
检测返回什么?
一个带有 encoding、confidence 和已解码 text 的 EncodingDetectionResult。
是否处理遗留标签?
是的——别名表会将类似 latin1 和 us-ascii 的标签映射到它们的规范编码。
检测会读取元标签吗?
prescan_meta_charset() 实现了标准的 meta-prescan 并参与检测。
API Reference 摘要
| 类/方法 | 描述 |
|---|---|
detect_encoding | 检测编码并解码字节 |
EncodingDetectionResult | 检测结果对象 |
sniff_bom | 字节顺序标记检查 |
prescan_meta_charset | 标准元预扫描 |
decode_bytes | 使用选定的编码解码 |
get_canonical_name | 规范化编码标签 |