Bir dosyanın kodlaması nasıl tespit edilir?


115

Dosya sistemimde (Windows 7) Bazı metin dosyalarım var (Bunlar önemliyse, SQL komut dosyalarıdır).

Notepad ++ ile açıldığında , "Kodlama" menüsünde, bazılarının "UCS-2 Küçük Endian" ve bazılarının "UTF-8" ürün reçetesiz "koduna sahip oldukları bildirilir.

Buradaki fark nedir? Hepsi mükemmel bir betik gibi görünüyor. Dosyanın hangi kodlamaları Notepad ++ olmadan olduğunu nasıl söyleyebilirim?


7
Firefox'u kullanmanın oldukça basit bir yolu var. Dosyanızı Firefox'u, ardından Görünüm> Karakter Kodlama'yı kullanarak açın. Burada ayrıntılı .
Catherine Gasnier

Sezgisel kullan. ödeme encave chardetPOSIX sistemleri için.
Janus Troelsen

3
Bence alternatif bir cevap DENEME ve HATA. iconvözellikle bu amaç için kullanışlıdır. Temelde, hangisinin işe yaradığını görmek için bozuk karakter dizgilerini / metnini farklı kodlamalar aracılığıyla yinelersiniz. Karakterler artık bozulmadığında kazanırsınız. Programlı bir örnekle cevap vermeyi çok isterim. Fakat ne yazık ki korunan bir soru.
Brandon Bertelsen,

FF Mozilla Charset Detectors kullanıyor . Başka bir basit yol da dosyayı MS word ile
açmaktır

Sisteminizde mevcutsa chardetveya chardetectmevcut değilse, paketi paket yöneticiniz aracılığıyla yükleyebilirsiniz (örn apt search chardet. Ubuntu / debian paketinde genellikle python-chardetya python3-chardetda denir ) ya da pip kullanarak pip install chardet(veya pip install cchardetdaha hızlı c-optimize edilmiş versiyon için).
ccpizza

Yanıtlar:


97

Dosyalar genellikle kodlarını bir dosya başlığı ile belirtir. Burada birçok örnek var . Bununla birlikte, başlığı okumak bile bir dosyanın kodlamasını gerçekten kullandığından emin olamazsınız .

Örneğin, ilk üç bayt olan bir dosya 0xEF,0xBB,0xBFolduğunu muhtemelen UTF-8 kodlu dosya. Ancak, karakterlerle başlamak üzere olan bir ISO-8859-1 dosyası olabilir . Veya tamamen farklı bir dosya türü olabilir.

Notepad ++, bir dosyayı hangi kodlamanın kullandığını ve çoğu zaman doğru şekilde kullandığını tahmin etmek için elinden gelenin en iyisini yapar. Bazen yanlış olsa bile, bu yüzden 'Kodlama' menüsü oradadır, bu nedenle en iyi tahminini geçersiz kılabilirsiniz.

Bahsettiğiniz iki kodlama için:

  • "UCS-2 Little Endian" dosyaları (Ben bilgi anladığımız dayalı UTF-16 dosyalardır burada böylece) muhtemelen başlamak 0xFF,0xFEolarak ilk 2 bayt. Söyleyebileceğim kadarıyla, Notepad ++, UTF-16'nın belirli yönlerini desteklemediğinden onları "UCS-2" olarak tanımlıyor.
  • "BOM olmadan UTF-8" dosyaları herhangi bir başlık baytına sahip değildir. "BOM'suz" bitiğin anlamı budur.


2
BOM ile başlayan bir dosya neden "BOM'siz UTF-8" olarak otomatik olarak algılanıyor?
Michael Borgwardt

2
Bir dosya 0xFF ile başlatıldıysa, 0xFE, UCS-2 değil, UTF-16 olarak algılanmalıdır. UCS-2 muhtemelen tahmin edilir çünkü esas olarak ASCII karakterleri içerir ve bu nedenle diğer tüm baytlar null olur.
Michael Borgwardt

2
Tecrübe ile ne yazık ki meta veriler (“başlıklar”) da yanlış olabilir. Bilgiyi tutan veritabanı bozulabilir veya orijinal yükleyici bu durumu yanlış yapmış olabilir. (Bu son birkaç aydır bizim için önemli bir problemdi; bazı veriler “gerçekten ISO8859-1 olması dışında“ UTF-8 ”olarak yüklendi, çünkü bunlar gerçekten aynı mı ?!” Bah! Scientists tutmalı meta verilerin kaynağından uzakta, sadece yanlış
anlıyorlar

1
Aslında kodlama sorununun hala 2014'te kalması "komik" olduğunu düşünüyorum çünkü dünyadaki hiçbir dosya "ï» ¿"ile başlamayacak ve yanlış kodlama içeren bir HTML sayfasını gördüğümde çok şaşırdım. Bu bir olasılık meselesi. Başka bir kodlama garip karakterlerden kaçınırsa yanlış kodlamayı seçmek düşünülemez. Garip karakterlerden kaçınan kodlamayı aramak sanırım vakaların% 99,9999'unda işe yarayacak. Ama yine de hatalar kafa karıştırıcı genç geliştiricilere gerçekleştirmek bu fikir .. Ayrıca yer kazanmak için yerine UTF8 ASCII kullanmak çok kafa karıştırıcı bir mesaj var .. vardır ..
nceki

18

Yapamazsın. Bunu yapabilseydiniz, orada “rasgele anlamsız” olan çok fazla web sitesi ya da metin dosyası olmazdı. Bu yüzden kodlama genellikle yük ile birlikte meta veri olarak gönderilir.

Değilse, yapabileceğiniz tek şey "akıllı bir tahmin" olmakla birlikte, aynı bayt sırası birkaç kodlamada geçerli olabileceğinden sonuç genellikle belirsizdir.


2
Tamam, öyleyse, Windows işletim sistemi bu bilgileri (meta veri) gerçekten bir yerde saklıyor mu? Muhtemelen kayıt defterinde?
Marcel,

Yanılıyorsun. Bu kod sayfaları - tamamen aynı değil. Unicode kodlamada tahmin edilecek algoritmalar vardır.
DeadMG

6
@Marcel: Hayır. Bu yüzden "metin dosyaları" saf ASCII dışında bir şey için çok sorunlu.
Michael Borgwardt

peki notepad ++ bunu yapabilir, metin dosyasının utf-8 kodlu olup olmadığını size söyleyebilir
user25
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.