Mam kilka .htm
plików, które otwierają się w Gedit bez żadnego ostrzeżenia / błędu, ale kiedy otwieram te same pliki Jedit
, ostrzega mnie przed nieprawidłowym kodowaniem UTF-8 ...
Metatag HTML stwierdza „charset = ISO-8859-1”. Jedit zezwala na listę zastępczych kodowań i listę automatycznych detektorów kodowania (obecnie „BOM XML-PI”), więc mój bezpośredni problem został rozwiązany. Ale to zmusiło mnie do zastanowienia się: co, jeśli nie ma tam metadanych?
Kiedy informacje o kodowaniu są po prostu niedostępne, czy istnieje program CLI, który może „odgadnąć”, które kodowanie może mieć zastosowanie?
I chociaż jest to nieco inna kwestia; czy istnieje program CLI, który testuje ważność znanego kodowania?
Odpowiedzi:
file
Komenda sprawia, że „najlepiej domysły” o kodowaniu. Użyj tego-i
parametru, aby wymusićfile
wydrukowanie informacji o kodowaniu.Demonstracja:
Oto jak stworzyłem pliki:
Obecnie wszystko jest utf-8. Ale przekonaj się:
Porównaj z https://en.wikipedia.org/wiki/Ę#Computer_encoding
Konwertuj na inne kodowania:
Sprawdź zrzut heksowy:
Utwórz coś „nieważnego”, mieszając wszystkie trzy:
Co
file
mówi:bez
-i
:file
Komenda nie ma pojęcia „ważne” lub „nieprawidłowe”. Po prostu widzi niektóre bajty i próbuje zgadnąć, jakie może być kodowanie. Jako ludzie możemy być w stanie rozpoznać, że plik jest plikiem tekstowym z niektórymi umlautami w „złym” kodowaniu. Ale jako komputer potrzebowałby sztucznej inteligencji.Można argumentować, że heurystyka
file
jest pewnego rodzaju sztuczną inteligencją. Jednak nawet jeśli jest, jest bardzo ograniczony.Oto więcej informacji o
file
poleceniu: http://www.linfo.org/file_command.htmlźródło
, but without any option :( ... I've now also tried a mixof UTF-16 and UTF-8 and ISO-8859-1.
plik file -iunknown-8bit
. Tak więc wydaje się to również odpowiedzią na: „Jak wykryć nieprawidłowe / nieznane kodowanie”file -I
to wielkie „i” zamiast małych liter.Nie zawsze jest możliwe ustalenie, na czym polega kodowanie pliku tekstowego. Na przykład sekwencja bajtów
\303\275
(c3 bd
w systemie szesnastkowym) może byćý
w UTF-8 lubý
w latin1,Ă˝
w latin2 lub羸
w BIG-5 i tak dalej.Niektóre kodowania mają nieprawidłowe sekwencje bajtów, więc na pewno można je wykluczyć. Dotyczy to w szczególności UTF-8; większość tekstów w większości kodowań 8-bitowych jest niepoprawna UTF-8. Można przetestować za ważnego UTF-8 z
isutf8
od moreutils lub ziconv -f utf-8 -t utf-8 >/dev/null
, między innymi.Istnieją narzędzia, które próbują odgadnąć kodowanie pliku tekstowego. Mogą popełniać błędy, ale często działają w praktyce, o ile celowo nie próbujesz ich oszukać.
file
Encode::Guess
(część standardowej dystrybucji) próbuje kolejno kodować ciąg bajtów i zwraca pierwsze kodowanie, w którym ciąg jest poprawnym tekstem.Jeśli w pliku znajdują się metadane (HTML / XML
charset=
, TeX\inputenc
, emacs-*-coding-*-
,…), zaawansowane edytory, takie jak Emacs lub Vim, często potrafią parsować te metadane. Nie jest to jednak łatwe do zautomatyzowania z poziomu wiersza poleceń.źródło
iconv
, właśnie uruchomiłem wszystkie 1168 kodowań (w tym aliasów) wymienionychiconv -l
na jednym z moich plików .htm ... Było 683 kodowań, które przeszły zbieranie. Rzeczywisty zestaw znaków pliku = ISO-8859-1 .. składa się ze wszystkich wartości z jednego paska ASCII-zakres. Znak inny niż ASCII to \ xA9.Również w przypadku, gdy plik -i daje nieznane
Możesz użyć tego polecenia php, które może odgadnąć zestaw znaków, jak poniżej:
W php możesz sprawdzić jak poniżej:
Określając jawnie listę kodowania:
Dokładniejsze „ mb_list_encodings ”:
Tutaj w pierwszym przykładzie widać, że umieściłem listę kodowań (wykryj kolejność list), które mogą być zgodne. Aby uzyskać dokładniejszy wynik, możesz użyć wszystkich możliwych kodowań poprzez: mb_list_encodings ()
Uwaga Funkcje mb_ * wymagają php-mbstring
Zobacz odpowiedź: https://stackoverflow.com/a/57010566/3382822
źródło