2012-06-13 5 views
23

Mam plik PHP, który utworzyłem z VIM, ale nie jestem pewien, który jest jego kodowania.Jak mogę się upewnić, że kodowanie pliku jest prawidłowe?

Kiedy korzystać z terminala i sprawdzić kodowanie za pomocą polecenia file -bi foo (mój system operacyjny Ubuntu 11.04) daje mi kolejny wynik:

text/html; charset=us-ascii

Ale gdy otwieram plik z gedit mówi, że jego kodowanie to UTF-8.

Która z nich jest poprawna? Chcę, aby plik był kodowany w UTF-8.

Domyślam się, że w pliku nie ma BOM i że polecenie file -bi odczytuje plik i nie znajduje żadnych znaków UTF-8, więc zakłada, że ​​jest to ascii, ale w rzeczywistości jest kodowane w UTF-8.

+0

Co znaków spoza ASCII w pliku? – dan04

Odpowiedz

39

Cóż, przede wszystkim pamiętać, że ASCII jest podzbiorem UTF-8, więc jeśli plik zawiera tylko znaki ASCII, to jest prawdą, że to zakodowane w kodzie ASCII i jest to prawdą, że to zakodowane w UTF-8.

Zwykle analizowany jest tylko krótki fragment na początku pliku, aby określić jego typ, więc może to być deklaracja - ascii, jeśli występują znaki spoza ASCII, ale wykracza poza początkowy segment plik. Z drugiej strony, gedit może powiedzieć, że plik jest UTF-8, nawet jeśli jest to ASCII, ponieważ UTF-8 jest preferowanym kodowaniem znaków gedit i zamierza zapisać plik z UTF-8, jeśli dodałeś jakieś znaki spoza ASCII podczas twoja sesja edycji. Ponownie, jeśli tak mówi gedit, nie byłoby to złe.

Teraz na pytanie:

  1. Run to polecenie:

    tr -d \\000-\\177 < your-file | wc -c 
    

    Jeśli wyjście mówi "0", to plik zawiera tylko znaki ASCII. Jest w ASCII (i jest również ważny UTF-8) Koniec historii.

  2. Run to polecenie

    iconv -f utf-8 -t ucs-4 < your-file >/dev/null 
    

    Jeśli pojawi się błąd, plik nie zawiera ważny UTF-8 (lub przynajmniej niektóre jego część jest uszkodzona).

    Jeśli nie wystąpi błąd, najprawdopodobniej plik ma format UTF-8. Dzieje się tak dlatego, że UTF-8 ma właściwości, które powodują, że bardzo trudno jest pomylić typowy tekst z jakimkolwiek innym powszechnie używanym kodowaniem znaków dla poprawnego UTF-8.

+0

Pierwsze polecenie zwróciło 0, a drugie polecenie nie zwróciło błędu, więc możemy powiedzieć, że to UTF-8. Dzięki! – ecantu

+0

daje mi 1120, co to znaczy? – jazzz

+1

* Co * daje 1120? "Wc"? Jeśli tak, to domyślam się, że masz 1120 nie-ASCII bajtów w pliku. – Celada

48
$ file --mime my.txt 
my.txt: text/plain; charset=iso-8859-1 
+0

To mnie uratowało! Dzięki wielkie! – daveomcd

+4

Uważam, że ważne jest, aby pamiętać, że, jak już wspomniała @Celada, 'plik' nie może * przyznać *, że jego wykrycie jest w 100% poprawne. –

14

(w systemie Linux)

$ chardet <filename> 

także zapewnia poziom ufności [0-1] wyjścia.

0

podstawie @Celada odpowiedź i @Arthur Zennig, Stworzyłem ten prosty skrypt:

#/bin/bash 

if [ "$#" -lt 1 ] 
then 
    echo "Usage: utf8-check filename" 
    exit 1 
fi 

chardet $1 
countchars="$(tr -d \\000-\\177 < $1 | wc -c)" 
if [ $countchars -eq 0 ] 
then 
echo "Ascii"; 
exit 0 
fi 

{ 
    iconv -f utf-8 -t ucs-4 < $1 >/dev/null 
    echo "UTF-8" 
} || { 
    echo "not UTF-8 or corrupted" 
}