Soru tarihi:
Verilerin kodlanması (coding) ve dekodlanması (decoding), farklı cihazlar, yazılımlar ve platformlar arasında bilgi alışverişi gerekliliğiyle birlikte önem kazanmıştır. Python'da bu konu, Python 3.x ile birlikte str (dizeler) ve bytes (baytlar) arasında katı bir ayrım olduğu için kritik hale gelmiştir. Dizeler, Unicode karakterleri dizisi iken, baytlar bayt dizisidir.
Sorun:
Dosyalar, ağlar ve harici sistemlerle çalışırken, verileri bayt temsilinden dizelere dönüştürmek zorunda kalınır. Yanlış kodlama kullanımı, UnicodeEncodeError ve UnicodeDecodeError hatalarına, veri bütünlüğünün bozulmasına ve farklı dillerle ilgili sorunlara yol açabilir.
Çözüm:
Python'da bir diziyi baytlara dönüştürmek için .encode() yöntemi, tersine dönüştürmek için .decode() yöntemi kullanılır. En yaygın kodlama "utf-8"'dir:
text = "Merhaba, dünya!" encoded = text.encode('utf-8') # Diziyi baytlara kodla print(encoded) # b'\xd0\x9f\xd1\x80...' decoded = encoded.decode('utf-8') # Geri diziye dekodla print(decoded) # 'Merhaba, dünya!'
Anahtar özellikler:
open(..., encoding='utf-8')).Yanlış bir kodlama ile bayt dizisini dekode etmeye çalışırsanız ne olur?
Yanlış bir kodlama kullanarak baytları dekode etmeye çalıştığınızda bir hata oluşacak veya hatalı bir dize elde edeceksiniz. Örneğin:
b = b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82' wrong = b.decode('latin-1') print(wrong) # 'Merhaba' yerine şaşalı bir şey yazar
Diziyi ve bayt dizisini doğrudan + ile birleştirebilir misiniz?
Hayır. Bu bir TypeError hatası verecektir.
s = "abc" b = b"def" # s + b # TypeError: str'i (bayt) str ile birleştiremezsiniz
Metin dosyasını açıkça belirtilmiş bir kodlama olmadan yazabilir misiniz?
Evet, ama bu kötü bir uygulama olarak kabul edilir çünkü, sistemin varsayılan kodlaması kullanılır ve bu, OS ayarlarına bağlıdır, bu da platformlar arasında uyumsuzluğa yol açar.
Programcı, Windows'ta kodlama belirtmeden bir günlüğü yazar. Günlük, Linux veya Mac üzerinde açıldığında, kirili alfabesi yerine şaşalı bir şey gösterir.
Artılar:
Eksiler:
Programcı, dosyalarla çalışırken her zaman encoding='utf-8' belirtir:
with open('log.txt', 'w', encoding='utf-8') as f: f.write('Program başarıyla tamamlandı')
Artılar:
Eksiler: