인코딩 감지
인코딩 감지
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
탐지 결과는 무엇을 반환하나요?
다음 EncodingDetectionResult은 encoding, confidence, 그리고 디코딩된 text을 포함합니다.
레거시 레이블이 처리됩니까?
예 — 별칭 테이블은 latin1 및 us-ascii과 같은 레이블을 해당 정규 인코딩에 매핑합니다.
감지는 메타 태그를 읽습니까?
prescan_meta_charset()은 표준 메타 프리스캔을 구현하고 감지에 참여합니다.
API Reference 요약
| 클래스/메서드 | 설명 |
|---|---|
detect_encoding | 인코딩을 감지하고 바이트를 디코드 |
EncodingDetectionResult | 감지 결과 객체 |
sniff_bom | Byte-order-mark 검사 |
prescan_meta_charset | 표준 메타 프리스캔 |
decode_bytes | 선택한 인코딩으로 디코드 |
get_canonical_name | 인코딩 레이블 정규화 |