Muszę znaleźć kodowanie wszystkich plików umieszczonych w katalogu. Czy istnieje sposób na znalezienie zastosowanego kodowania?
file
Komenda nie jest w stanie tego zrobić.
Interesujące mnie kodowanie to: ISO-8859-1. Jeśli kodowanie jest czymś innym, chcę przenieść plik do innego katalogu.
apropos encoding
. Przeszukuje tytuły i opisy wszystkich stron. Kiedy zrobić to na moim komputerze, widzę 3 narzędzia, które może mi pomóc, sądząc po ich opisy:chardet
,chardet3
,chardetect3
. Następnie, robiącman chardet
i czytając stronę podręcznika, mówi mi, żechardet
to tylko narzędzie, którego potrzebuję.us-ascii
, ale po dodaniu wiersza chińskiego komentarza staje sięutf-8
.file
rozpoznaje kodowanie, czytając treść pliku i zgadnij.Odpowiedzi:
Wygląda na to, że szukasz
enca
. Może zgadywać, a nawet konwertować między kodowaniami. Wystarczy spojrzeć na stronę podręcznika .Lub, jeśli to nie pomoże, użyj
file -i
(linux) lubfile -I
(osx). Spowoduje to wyświetlenie informacji typu MIME dla pliku, która będzie również zawierać kodowanie zestawu znaków. Znalazłem też stronę dla niego :)źródło
enca
wydaje się całkowicie bezużyteczny do analizy pliku napisanego w języku angielskim, ale jeśli zdarzy ci się patrzeć na coś w języku estońskim, może to rozwiązać wszystkie twoje problemy. Bardzo pomocne narzędzie, które ... </sarcasm>Jeśli chcesz to zrobić dla wielu plików
źródło
Do not prepend filenames to output lines
file -b --mime-encoding
wyprowadza tylko kodowanie zestawu znakówuchardet - biblioteka wykrywaczy kodowania przeniesiona z Mozilli.
Stosowanie:
Różne dystrybucje Linuksa (Debian / Ubuntu, OpenSuse-packman, ...) zapewniają pliki binarne.
źródło
sudo apt-get install uchardet
jest to tak łatwe, że postanowiłem się tym nie martwić ...uchardet
ma dużą przewagę nadfile
ienca
, w który analizuje cały plik (tylko próbował z plikiem 20GiB), w przeciwieństwie do tylko początek.oto przykładowy skrypt wykorzystujący plik -I i iconv, który działa na MacOsX. W swoim pytaniu musisz użyć mv zamiast iconv
źródło
file -b --mime-encoding
wyprowadza tylkoNaprawdę trudno jest ustalić, czy jest to iso-8859-1. Jeśli masz tekst składający się tylko z 7 znaków bitowych, którym może być również iso-8859-1, ale nie wiesz. Jeśli masz 8 bitów, znaki górnego regionu również występują w kodowaniu kolejności. Dlatego musiałbyś użyć słownika, aby lepiej odgadnąć, jakie to słowo i ustalić, która to litera. Wreszcie, jeśli wykryjesz, że może to być utf-8, to masz pewność, że nie jest to iso-8859-1
Kodowanie jest jedną z najtrudniejszych rzeczy do zrobienia, ponieważ nigdy nie wiadomo, czy nic ci nie mówi
źródło
W Debianie możesz także użyć
encguess
:źródło
uchardet
w Ubuntu i powiedział mi, że mój plik toWINDOWS-1252
. Wiem, że to było złe, ponieważ zapisałem go jako UTF-16 z Kate, aby przetestować. Jednakencguess
zgadnij poprawnie i został on wstępnie zainstalowany w Ubuntu 19.04.Aby przekonwertować kodowanie z 8859 na ASCII:
źródło
W Pythonie możesz użyć modułu chardet: https://github.com/chardet/chardet
źródło
Nie można tego zrobić w niezawodny sposób. Jedną z możliwości byłoby zbadać każdy znak w pliku, aby upewnić się, że nie zawiera żadnych znaków w zakresach
0x00 - 0x1f
czy0x7f -0x9f
, ale jak powiedziałem, to może być prawdziwe dla dowolnej liczby plików, w tym co najmniej jednego innego wariantu ISO8859.Inną możliwością jest poszukiwanie określonych słów w pliku we wszystkich obsługiwanych językach i sprawdzenie, czy możesz je znaleźć.
Na przykład znajdź odpowiednik angielskiego „i”, „ale”, „do”, „z” itd. We wszystkich obsługiwanych językach 8859-1 i sprawdź, czy występuje w nich duża liczba wystąpień plik.
Nie mówię o dosłownym tłumaczeniu, takim jak:
chociaż to możliwe. Mówię o popularnych słowach w języku docelowym (z tego co wiem, islandzki nie ma słowa na „i” - prawdopodobnie będziesz musiał użyć ich słowa na „ryba” [przepraszam, to trochę stereotypowe, nie zrobiłem tego oznacza każde przestępstwo, ilustrujące tylko punkt]).
źródło
Wiem, że interesuje Cię bardziej ogólna odpowiedź, ale to, co jest dobre w ASCII, jest zwykle dobre w innych kodowaniach. Oto jedno-liniowy Python, który określa, czy standardowym wejściem jest ASCII. (Jestem pewien, że to działa w Pythonie 2, ale przetestowałem to tylko w Pythonie 3).
źródło
Jeśli mówisz o plikach XML (ISO-8859-1), deklaracja XML w nich określa kodowanie:
<?xml version="1.0" encoding="ISO-8859-1" ?>
Możesz więc użyć wyrażeń regularnych (np. Z
perl
), aby sprawdzić każdy plik pod kątem takiej specyfikacji.Więcej informacji można znaleźć tutaj: Jak ustalić kodowanie pliku tekstowego .
źródło
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
źródło
W Cygwin wygląda to tak, jak dla mnie działa:
Przykład:
Możesz potokować to do awk i utworzyć polecenie iconv, aby przekonwertować wszystko na utf8, z dowolnego kodowania źródłowego obsługiwanego przez iconv.
Przykład:
źródło
Możesz wyodrębnić kodowanie pojedynczego pliku za pomocą polecenia file. Mam plik sample.html z:
sample.html: dokument HTML, tekst UTF-8 Unicode, z bardzo długimi liniami
Dokument HTML, tekst UTF-8 Unicode, z bardzo długimi liniami
text / html; charset = utf-8
utf-8
źródło
Używam następującego skryptu do
.
źródło
za pomocą tego polecenia:
możesz wyświetlić listę wszystkich plików w katalogu i podkatalogach oraz odpowiadające im kodowanie.
źródło
W Perlu użyj Encode :: Detect.
źródło