Kodlamalar ile ilgili genel sorun üzerinde tökezlediniz: Bir dosyanın hangi kodlamasında olduğunu nasıl anlayabilirim?
Yanıt: Dosya biçimi bunu sağlamadığı sürece yapamazsınız . Örneğin, XML aşağıdakilerle başlar:
<?xml encoding="utf-8"?>
Bu başlık, kodlama ne olursa olsun okunabilmesi için dikkatle seçilmiştir. Sizin durumunuzda böyle bir ipucu yok, bu yüzden ne editörünüz ne de Python'un neler olduğu hakkında hiçbir fikri yok. Bu nedenle, codecs
modülü kullanmanız vecodecs.open(path,mode,encoding)
ve Python'da eksik olan biti .
Düzenleyicinize gelince, dosyanın kodlamasını ayarlamak için bir yol sunup sunmadığını kontrol etmelisiniz.
UTF-8'in amacı 21 bit karakterleri (Unicode) 8 bit veri akışı olarak kodlayabilmektir (çünkü dünyadaki tüm bilgisayarların işleyebileceği tek şey budur). Ancak çoğu işletim sistemi Unicode döneminden önce geldiğinden, kodlama bilgilerini sabit diskteki dosyalara eklemek için uygun araçlara sahip değildir.
Bir sonraki konu Python'daki temsilidir. Bu yorum heikogerlach tarafından mükemmel açıklanmıştır . Konsolunuzun yalnızca ASCII görüntüleyebileceğini anlamalısınız. Unicode veya herhangi bir şey = = charcode 128'i görüntülemek için, bazı çıkış yöntemleri kullanmalıdır. Düzenleyicinizde, çıkış karakter dizisini değil, dizenin ne anlama geldiğini yazmalısınız (bu durumda umlaut'a girmeli ve dosyayı kaydetmelisiniz).
Bununla birlikte, kaçan bir dizeyi bir dizeye dönüştürmek için Python işlevi eval () kullanabilirsiniz:
>>> x = eval("'Capit\\xc3\\xa1n\\n'")
>>> x
'Capit\xc3\xa1n\n'
>>> x[5]
'\xc3'
>>> len(x[5])
1
Gördüğünüz gibi, "\ xc3" dizesi tek bir karaktere dönüştürüldü. Bu artık 8 bitlik bir dize, UTF-8 kodlu. Unicode'u almak için:
>>> x.decode('utf-8')
u'Capit\xe1n\n'
Gregg Lind sordu: Bence burada eksik bazı parçalar var: f2 dosyası içerir: hex:
0000000: 4361 7069 745c 7863 335c 7861 316e Capit\xc3\xa1n
codecs.open('f2','rb', 'utf-8')
, örneğin, hepsini ayrı bir karakterde okur (beklenen) ASCII'de çalışacak bir dosyaya yazmanın herhangi bir yolu var mı?
Cevap: Bu ne demek istediğine bağlı. ASCII,> 127 karakterlerini temsil edemez. Bu nedenle, "sonraki birkaç karakter özel bir şey ifade ediyor" demenin bir yolu olması gerekir, bu da "\ x" dizisinin yaptığıdır. Diyor ki: Sonraki iki karakter tek bir karakterin kodudur. "\ u" aynı şeyi 0xFFFF (65535) 'e kadar Unicode kodlamak için dört karakter kullanarak yapar.
Dolayısıyla, doğrudan Unicode'u ASCII'ye yazamazsınız (çünkü ASCII aynı karakterleri içermez). Dize kaçışları olarak yazabilirsiniz (f2'de olduğu gibi); bu durumda, dosya ASCII olarak temsil edilebilir. Veya UTF-8 olarak yazabilirsiniz, bu durumda 8 bit güvenli bir akışa ihtiyacınız vardır.
Kullanmakta decode('string-escape')
olduğunuz çözüm işe yarıyor, ancak ne kadar bellek kullandığınızı bilmelisiniz:codecs.open()
.
Bir dosyanın sadece 8 bitlik bir bayt dizisi olduğunu unutmayın. Ne bitlerin ne de baytların bir anlamı yoktur. "65" A "anlamına gelen sizsiniz. Yana \xc3\xa1
"à" olması gerektiğini ancak bilgisayar bilmek imkanı bulunmadığını, dosyayı yazarken kullanılan kodlamayı belirterek söylemek gerekir.