it-swarm-tr.com

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

Birkaç .htm dosyaları Gedit içinde herhangi bir uyarı/hata olmadan açılıyor, ancak bu dosyaları Jedit ile açtığımda, geçersiz UTF-8 kodlaması konusunda beni uyarıyor ...

HTML meta etiketi "charset = ISO-8859-1" ifadesini belirtir. Jedit, Yedek kodlamaların listesine ve bir Otomatik kodlayıcıların kodlama listesine (şu anda "BOM XML-PI"), bu yüzden acil sorunum çözüldü. Ama bu beni düşündürdü: Ya meta veriler orada olmasaydı?

Kodlama bilgisi mevcut olmadığında, hangi kodlamaların geçerli olabileceğini "en iyi tahmin" edebilecek bir CLI programı var mı?

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

55
Peter.O

file komutu kodlama hakkında "en iyi tahminler" yapar. Kodlama hakkında bilgi yazdırmaya file zorlamak için -i Parametresini 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

İşte dosyaları nasıl oluşturdum:

$ echo ä > umlaut-utf8.txt 

Günümüzde her şey utf-8. Ama kendinizi ikna edin:

$ 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ün:

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

Onaltılık dökümü kontrol edin:

$ 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 

file ne diyor:

$ 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

-i olmadan:

$ 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

file komutunun "geçerli" veya "geçersiz" hakkında hiçbir fikri yoktur. Sadece bazı baytları görür ve kodlamanın ne olabileceğini tahmin etmeye çalışır. İnsanlar olarak, bir dosyanın "yanlış" kodlamada bazı imleçleri olan bir metin dosyası olduğunu anlayabiliriz. Ama bilgisayar olarak bir çeşit yapay zekaya ihtiyaç duyacaktı.

file sezgisel yönteminin bir çeşit yapay zeka olduğunu iddia edebiliriz. Yine de, öyle olsa bile, çok sınırlı bir konudur.

file komutu hakkında daha fazla bilgi: http://www.linfo.org/file_command.html

70
lesmana

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 (Onaltılık olarak c3 bd) UTF-8'de ý Veya latin1'de ý Veya Ă˝ latin2'de veya ve BIG-5'te vb.

Bazı kodlamaların geçersiz bayt dizileri vardır, bu yüzden bunları kesin olarak dışlamak mümkündür. Bu özellikle UTF-8 için geçerlidir; Çoğu 8 bit kodlamadaki çoğu metin geçerli UTF-8 değildir. Diğerlerinin yanı sıra moreutils adresinden isutf8 Veya iconv -f utf-8 -t utf-8 >/dev/null İle geçerli UTF-8 testi yapabilirsiniz.

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

  • file
  • Perl Encode::Guess (standart dağıtımın bir parçası) bir bayt dizesinde ardışık kodlamaları dener ve dizenin 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 . Ancak komut satırından otomatikleştirmek kolay değil.

Ayrıca -i dosyası size bilinmiyorsa

Aşağıdaki gibi karakter setini tahmin edebilen bu php komutunu kullanabilirsiniz:

Php 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 (liste sırasını algıla) bir listesini koyduğumu görebilirsiniz. Daha doğru sonuç elde etmek için tüm olası kodlamaları şu yöntemlerle kullanabilirsiniz: mb_list_encodings ()

Not mb_ * işlevleri php-mbstring gerektirir

apt-get install php-mbstring 

Cevaba bakın: https://stackoverflow.com/a/57010566/3382822

1
Mohamed23gharbi