EMZETT.
Giriş yap

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

  1. Kodlamayı belirt: open("file.txt", encoding="utf-8") veya encoding="cp1252" / "latin-1".
  2. Kodlamayı tespit et: düzenleyici (VS Code: sağ alt), file -i file.txt, charset-normalizer kütüphanesi.
  3. BOM ile: encoding="utf-8-sig".
  4. İkili veriler için "rb" kipinde aç.
  5. Son çare olarak hataları değiştir: errors="replace" veya "ignore" (karakter kaybeder, yalnızca kabul edilebilirse).
  6. 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ç veya cp1252 olarak 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