Bir metin dosyasının kodlamasını nasıl test edebilirim… Geçerli mi ve nedir?


46

Herhangi bir uyarı / hata olmadan Gedit'te.htm açan birkaç dosyam var , ancak bu dosyaları açtığımda Jeditgeçersiz UTF-8 kodlaması konusunda beni uyarıyor ...

HTML meta etiketi "charset = ISO-8859-1" ifadesini belirtir. Jedit , geri dönüş kodlamalarının bir listesini ve kodlama otomatik dedektörlerinin bir listesini (şu anda "BOM XML-PI") sağlar, bu yüzden acil sorunum çözüldü. Ama bu beni düşündürdü: Ya meta veriler orada değilse?

Kodlama bilgisi henüz mevcut olmadığında, hangi kodlamaların uygulanabileceğini "en iyi tahmin" edebilecek bir CLI programı var mı?

Ve, biraz farklı bir konu olmasına rağmen; bilinen bir kodlamanın geçerliliğini test eden bir CLI programı var mı?


"Metin dosyası kodlamasını otomatik olarak nasıl algılayabilir?" superuser.com/questions/301552/…
buzz3791

Yanıtlar:


60

fileKomut kodlaması hakkında "en iyi tahmin" yapıyor. Kodlama hakkında bilgi yazdırmaya -izorlamak fileiçin parametreyi kullanın .

gösteri:

$ file -i *
umlaut-iso88591.txt: text/plain; charset=iso-8859-1
umlaut-utf16.txt:    text/plain; charset=utf-16le
umlaut-utf8.txt:     text/plain; charset=utf-8

Dosyaları nasıl oluşturduğum:

$ echo ä > umlaut-utf8.txt 

Günümüzde her şey utf-8. Ama kendini ikna et:

$ hexdump -C umlaut-utf8.txt 
00000000  c3 a4 0a                                          |...|
00000003

Https://en.wikipedia.org/wiki/Ä#Computer_encoding ile karşılaştırın

Diğer kodlamalara dönüştür:

$ iconv -f utf8 -t iso88591 umlaut-utf8.txt > umlaut-iso88591.txt 
$ iconv -f utf8 -t utf16 umlaut-utf8.txt > umlaut-utf16.txt 

Altıgen dökümü kontrol et:

$ hexdump -C umlaut-iso88591.txt 
00000000  e4 0a                                             |..|
00000002
$ hexdump -C umlaut-utf16.txt 
00000000  ff fe e4 00 0a 00                                 |......|
00000006

Üçünü de karıştırarak "geçersiz" bir şey oluşturun:

$ cat umlaut-iso88591.txt umlaut-utf8.txt umlaut-utf16.txt > umlaut-mixed.txt 

Ne filediyor:

$ file -i *
umlaut-iso88591.txt: text/plain; charset=iso-8859-1
umlaut-mixed.txt:    application/octet-stream; charset=binary
umlaut-utf16.txt:    text/plain; charset=utf-16le
umlaut-utf8.txt:     text/plain; charset=utf-8

olmadan -i:

$ file *
umlaut-iso88591.txt: ISO-8859 text
umlaut-mixed.txt:    data
umlaut-utf16.txt:    Little-endian UTF-16 Unicode text, with no line terminators
umlaut-utf8.txt:     UTF-8 Unicode text

fileKomut "geçerli" veya "geçersiz" nin hiçbir fikri yok. Sadece bazı baytları görür ve kodlamanın ne olacağını tahmin etmeye çalışır. İnsanlar olarak, bir dosyanın "yanlış" kodlamada bazı ümitlere sahip bir metin dosyası olduğunu anlayabiliriz. Fakat bilgisayar olarak bir çeşit yapay zekaya ihtiyaç duyacaktır.

Birisi, sezgisel mirasının filebir çeşit yapay zeka olduğunu iddia edebilir . Ancak, öyle olsa bile, çok sınırlı bir tanesi.

İşte filekomut hakkında daha fazla bilgi : http://www.linfo.org/file_command.html


Teşekkürler, bu işe yaradı ... Ben denedim 'dosya , but without any option :( ... I've now also tried a mixof UTF-16 and UTF-8 and ISO-8859-1. dosyası -i` bildirdi unknown-8bit. Yani, bu aynı zamanda "Cevap geçersiz / bilinmeyen bir kodlamanın nasıl tespit edileceği" cevabı gibi görünüyor
Peter.O

Buraya gelip mac'ta olanlar için file -Iküçük harf yerine büyük bir 'i' harfiyle yazıyor.
samuraiseoul

21

Bir metin dosyasının kodlamasının ne olduğundan emin olmak her zaman mümkün değildir. Örneğin, bayt dizisi \303\275( c3 bdonaltılık biçimde) ýUTF-8'de veya ýlatin1'de veya Ă˝latin2'de veya BIG-5'te vb. Olabilir .

Bazı kodlamalarda geçersiz bayt dizileri vardır, bu yüzden kesin olarak onları dışarıda bırakmak mümkündür. Bu özellikle UTF-8 için geçerlidir; Çoğu 8 bit kodlamadaki çoğu metin UTF-8 geçerli değil. Geçerli bir UTF-8 ile test edebilirsiniz isutf8gelen moreutils veya iconv -f utf-8 -t utf-8 >/dev/null, diğerleri arasında.

Bir metin dosyasının kodlamasını tahmin etmeye çalışan araçlar var. Hata yapabilirler, ancak kasten kandırmaya çalışmadığınız sürece pratikte çalışırlar.

  • file
  • PerlEncode::Guess (standart dağılımın bir parçası) bir bayt dizgisinde ardışık kodlamaları dener ve dizgenin geçerli metin olduğu ilk kodlamayı döndürür.
  • Enca bir kodlama tahmincisi ve dönüştürücüsüdür. Bu dilde olduğunu düşündüğünüz bir dil adı ve metni verebilirsiniz (desteklenen diller çoğunlukla Doğu Avrupa dilleridir) ve kodlamayı tahmin etmeye çalışır.

Dosyada meta veriler (HTML / XML charset=, TeX \inputenc, emacs -*-coding-*-,…) varsa, Emacs veya Vim gibi gelişmiş düzenleyiciler genellikle bu meta verileri ayrıştırabilir. Yine de komut satırından otomatikleştirmek kolay değil.


İyi bir genel bakış için teşekkürler ... Evet, "en iyi tahmin", kodlamanın bilinmediği tek seçenek olabilir ... Kullanarak iconv, sadece iconv -l.htm dosyalarımın birinde listelenen 1168 kodlamanın tümünü (diğer adlar dahil) koştum ... Hedefi geçen 683 kodlama vardı .. Dosyanın asıl karakter dizisi = ISO-8859-1 .. tüm çubuklardan bir ASCII-aralığı değerinden oluşmuş .. ASCII dışı karakter \ xA9 idi.
Peter.O

0

Ayrıca -i dosyanız durumunda, bilinmeyen bir şey veriyorsa

Karakter kümesini aşağıdaki gibi tahmin edebilen bu php komutunu kullanabilirsiniz:

PHP'de aşağıdaki gibi kontrol edebilirsiniz:

Kodlama listesini açıkça belirtme:

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), 'UTF-8, ASCII, JIS, EUC-JP, SJIS, iso-8859-1') . PHP_EOL;"

Daha doğru " mb_list_encodings ":

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), mb_list_encodings()) . PHP_EOL;"

Burada ilk örnekte, eşleşen olabilecek kodlamaların bir listesini koyduğumu (liste sırasını algıladığımı) görebilirsiniz. Daha kesin sonuç almak için, mümkün olan tüm kodlamaları: mb_list_encodings () ile kullanabilirsiniz.

Not mb_ * işlevleri php-mbstring gerektirir

apt-get install php-mbstring 

Cevabı gör: https://stackoverflow.com/a/57010566/3382822

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.