Wykrywanie kodowania
Wykrywanie kodowania
HTML przychodzi jako bajty, a warstwa kodowania odpowiada na pierwsze pytanie każdego potoku: które kodowanie i jaki tekst? Wykrywanie podąża za standardowym podejściem — najpierw znaczniki kolejności bajtów, potem deklaracje w treści.
Wykrywanie z bajtów
detect_encoding() analizuje strumień bajtów i zwraca EncodingDetectionResult zawierający wykryte kodowanie, poziom pewności oraz zdekodowany tekst. UTF-8 BOM jest wykrywane jako pewne, a bajty BOM są usuwane z zdekodowanego wyjścia:
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)Zestaw narzędzi wykrywania
sniff_bom() sprawdza jedynie znaczniki kolejności bajtów; prescan_meta_charset() stosuje standardowy meta-przegląd w celu wykrycia deklaracji zestawu znaków w dokumencie; decode_bytes() wykonuje dekodowanie po wybraniu kodowania. Nieobsługiwane kodowania powodują wyrzucenie typowanego UnsupportedEncodingError.
Nazwy kanoniczne
Etykiety kodowania różnią się w praktyce — latin1, iso-8859-1 i us-ascii wszystkie oznaczają windows-1252 zgodnie ze standardem kodowania. get_canonical_name() mapuje dowolną zarejestrowaną etykietę na jej kanoniczną nazwę.
Wskazówki i najlepsze praktyki
- Zaufaj BOM: gdy jest obecny, jest definitywny, a detektor raportuje pewną pewność
- Znormalizuj etykiety przy użyciu
get_canonical_name()przed porównywaniem kodowań - Użyj
result.textz wykrywania zamiast ponownie dekodować bajty samodzielnie
Typowe problemy
| Problem | Przyczyna | Rozwiązanie |
|---|---|---|
| BOM pojawia się w zdekodowanym tekście | Ręczne dekodowanie zamiast detect_encoding() | Wykrywanie usuwa bajty BOM z result.text |
| Porównanie etykiet nie powiodło się | Niezgodność aliasu z nazwą kanoniczną | Normalizuj przy użyciu get_canonical_name() |
Podniesiono UnsupportedEncodingError | Kodowanie wejściowe spoza rejestru | Obsłuż błąd typowany; ponownie zakoduj w poprzednim etapie |
FAQ
Co zwraca wykrywanie?
Jedno EncodingDetectionResult z encoding, confidence i zdekodowanym text.
Czy obsługiwane są starsze etykiety?
Tak — tabela aliasów mapuje etykiety takie jak latin1 i us-ascii na ich kanoniczne kodowania.
Czy detekcja odczytuje meta tagi?
prescan_meta_charset() implementuje standard meta-prescan i uczestniczy w wykrywaniu.
Podsumowanie API Reference
| Klasa/Metoda | Opis |
|---|---|
detect_encoding | Wykryj kodowanie i dekoduj bajty |
EncodingDetectionResult | Obiekt wyniku wykrywania |
sniff_bom | Sprawdzanie znacznika kolejności bajtów |
prescan_meta_charset | Meta-przegląd standardów |
decode_bytes | Dekoduj przy użyciu wybranego kodowania |
get_canonical_name | Ustandaryzuj etykietę kodowania |