Czy istnieje polecenie systemu Linux, aby dowiedzieć się, czy plik to UTF-8?

14

.iniPliki Joomla wymagają zapisania jako UTF-8.

Po edycji nie jestem pewien, czy pliki mają format UTF-8, czy nie.

Czy istnieje takie polecenie Linuksa filelub kilka poleceń, które powiedzą, czy plik rzeczywiście ma format UTF-8, czy nie?

Edward
źródło
4
Nie możesz podać kodowania pliku. Możesz tylko zgadnąć. Możesz w większości zgadywać, ale czasem domysły się nie udają. filejest przykładem programu zgadującego mądrze.
Marco
1
@Marco: Można jednak sprawdzić, czy jest to poprawny UTF-8, czy nie. Istnieje kilka kodowań, które mogą błędnie przejść jako poprawne UTF-8, ale prawie nigdy nie dzieje się to w przypadku kodowania / kodowania ISO-8859-𝒏 lub Windows-125𝒏.
user1686 24.09.2013

Odpowiedzi:

28

Możesz określić kodowanie pliku za pomocą następującego polecenia:

file -bi filename
Rik
źródło
3
@nicolas W systemie MacOS możesz spróbować file -I filename(-I jest wielką literą i).
Rik
5
Czy to czyta cały plik?
ctrl-alt-delor
2
@ kojow7 utf-8 nie ma nagłówka. Czysty ASCII (tylko 7-bitowy), jest nie do odróżnienia od utf-8 (o to chodzi, nagłówek spowoduje różnego rodzaju problemy). Więc jeśli masz plik ASCII dla pierwszego MB, to ma on pojedynczy znak UTF-8, to nie będziesz wiedział, chyba że przeczytasz cały plik.
ctrl-alt-delor
3
Nie należy tego akceptować jako odpowiedzi. Komenda „plik” tego nie robi; czyta tylko część pliku i używa magicznych liczb, aby się domyślić. Czasami „plik” może i da ci błędną odpowiedź. Aby sprawdzić, czy plik przechodzi kodowanie takie jak ascii, iso-8859-1, utf-8 lub cokolwiek innego, dobrym rozwiązaniem jest użycie polecenia „iconv”.
Tim
1
Przetestowałem to i może i nie może zawieść.
Tim
9

Jest, użyj isutf8polecenia z pakietu moreutils .

Źródło: Jak rozpoznać, czy plik jest zakodowany w UTF-8, czy nie?


Pablo Olmos de Aguilera C.
źródło
@davidpostill Jestem ciekawy, czy złą praktyką jest cytowanie autora w referencji?
Pablo Olmos de Aguilera C.
Nie. Dobrą praktyką jest jednak, aby link mówił, dokąd mnie prowadzi. Załóżmy, że czytam tylko niebieski tekst. Po edycji mogę powiedzieć, dlaczego i kiedy powinienem to kliknąć. Przedtem nie mogłem. (To nie ja dokonałem edycji, ale jestem pewien, że 94% jestem pewien, że o to chodziło.)
Hermann Döppes
Ładnie i ładnie współpracuje find -type f -exec isutf8 {} +, ponieważ cytuje też nazwę pliku. (A korzystanie find ... -exec ... +jest również szybkie)
Tomasz Gandor
2

Nie używaj filepolecenia. Nie sprawdza całego pliku i w zasadzie zgaduje. Czasami daje nieprawidłowe odpowiedzi.

Możesz sprawdzić, czy plik przechodzi kodowanie UTF-8 w następujący sposób:

$ iconv -f utf8 <filename> -t utf8 -o /dev/null

Kod powrotu równy zero oznacza, że ​​przekazuje UTF8. Niezerowy kod powrotu oznacza, że ​​nie jest poprawny UTF8.

Nie można ustalić, czy plik został koniecznie wyeksportowany przy użyciu określonego schematu kodowania, ponieważ niektóre schematy kodowania nakładają się. Aby to zrobić, konieczne jest osadzenie metadanych w pliku, a nawet wtedy zaufasz każdemu, kto wygenerował ten plik, zamiast samodzielnie go sprawdzać ... i zawsze powinieneś sprawdzać go samodzielnie.

Tim
źródło
0

Jeszcze innym sposobem jest użycie recode, które zakończy się błędem, jeśli spróbuje dekodować UTF-8 i napotka nieprawidłowe znaki.

if recode utf8/..UCS < "$FILE" >/dev/null 2>&1; then
    echo "Valid utf8 : $FILE"
else
    echo "NOT valid utf8: $FILE"
fi
mivk
źródło