UnicodeDecodeError (Python) ve mojibake
Kısaca: Python baytları metin olarak okuyamaz, çünkü dosyanın karakter kodlaması varsayılandan farklıdır.
Biraz daha ayrıntılı: Mesaj: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe4 in position 12: invalid continuation byte veya Windows’ta 'charmap' codec can't decode byte …. Metin baytlardan oluşur; bir kodlama hangi baytların hangi karakterlere karşılık geldiğini belirler. Varsayılan gerçek olanla uyuşmazsa bu hata veya mojibake (“ä” yerine “ä”) ortaya çıkar.
Ayrıntılı
Nedenler
- Dosya Latin-1/Windows-1252’dir (örneğin eski Excel veya Windows’tan), Python UTF-8 bekler.
- Windows’ta
open()varsayılan kodlaması çoğu zaman UTF-8 değil,cp1252’dir. - İkili veriler (görseller, ZIP) metin olarak okunuyor.
- BOM (bayt sırası işareti) içeren bir UTF-8 dosyası veya UTF-16.
- Metin yanlışlıkla birkaç kez yeniden kodlandı.
Çözümler
- Kodlamayı belirt:
open("file.txt", encoding="utf-8")veyaencoding="cp1252"/"latin-1". - Kodlamayı tespit et: düzenleyici (VS Code: sağ alt),
file -i file.txt,charset-normalizerkütüphanesi. - BOM ile:
encoding="utf-8-sig". - İkili veriler için
"rb"kipinde aç. - Son çare olarak hataları değiştir:
errors="replace"veya"ignore"(karakter kaybeder, yalnızca kabul edilebilirse). - Her şeyi UTF-8’de standartlaştır, dosyaları UTF-8 olarak kaydet ve HTML’de
<meta charset="utf-8">ayarla. Excel’den CSV için: “CSV UTF-8” seç veyacp1252olarak oku.
Mojibake’yi onarmak
Tipik örüntü: UTF-8 metin Latin-1 olarak okundu. Python’da geri yol: text.encode("latin-1").decode("utf-8"). ftfy kütüphanesi yardımcı olur. Her zaman örneklerle test et, çünkü birden fazla yanlış kodlama daha karmaşıktır.
Ayrıca bak: ASCII ve karakter kümeleri, UTF-8 ve karakter kodlaması, ModuleNotFoundError