2012-06-13 10 views
23

Ho un file PHP che ho creato con VIM, ma non sono sicuro di quale sia la sua codifica.Come posso essere sicuro della codifica del file?

Quando uso il terminale e controllare la codifica con il comando file -bi foo (Il mio sistema operativo è Ubuntu 11.04) mi dà il risultato seguente:

text/html; charset=us-ascii

Ma, quando ho aperto il file con gedit dice che la sua codifica è UTF-8.

Quale è corretto? Voglio che il file sia codificato in UTF-8.

La mia ipotesi è che non ci sia BOM nel file e che il comando file -bi legga il file e non trovi caratteri UTF-8, quindi presuppone che sia ascii, ma in realtà è codificato in UTF-8.

+0

caratteri Che non ASCII sono nel file? – dan04

risposta

39

Beh, prima di tutto, si noti che ASCII è un sottoinsieme di UTF-8, quindi se il vostro file contiene solo caratteri ASCII, è corretto dire che è codificato in ASCII e è corretto dire che è codificato in UTF-8.

Detto questo, file di solito esamina solo un segmento breve all'inizio del file per determinarne il tipo, quindi potrebbe dichiararlo us-ascii se ci sono caratteri non ASCII ma sono oltre il segmento iniziale di il file. D'altra parte, gedit potrebbe dire che il file è UTF-8 anche se è ASCII perché UTF-8 è la codifica dei caratteri preferita da gedit e intende salvare il file con UTF-8 se si desidera aggiungere caratteri non ASCII durante la tua sessione di modifica. Di nuovo, se è quello che sta dicendo gedit, non sarebbe sbagliato.

Ora alla tua domanda:

  1. eseguire questo comando:

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

    Se l'uscita dice "0", quindi il file contiene solo caratteri ASCII. È in ASCII (ed è anche UTF-8 valido) Fine della storia.

  2. eseguire questo comando

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

    Se si ottiene un errore, il file non contiene validi UTF-8 (o almeno, una parte di esso è danneggiato).

    Se non si verifica alcun errore, è estremamente probabile che il file sia UTF-8. Questo perché UTF-8 ha proprietà che rendono molto difficile l'errore di testo tipico in qualsiasi altra codifica di caratteri comunemente usata per UTF-8 valido.

+0

Il primo comando ha restituito 0 e il secondo comando non ha restituito un errore, quindi possiamo dire che è UTF-8. Grazie! – ecantu

+0

mi sta dando 1120, cosa significa? – jazzz

+1

* Cosa * ti sta dando 1120? Il 'wc'? Se è così allora immagino tu abbia 1120 byte non ASCII nel file. – Celada

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

Questo mi ha salvato! grazie mille! – daveomcd

+4

Trovo importante notare che, come @Celada ha già menzionato, 'file' non può * garantire * che il rilevamento sia corretto al 100%. –

14

(su Linux)

$ chardet <filename> 

trasporta anche il livello di confidenza [0-1] dell'uscita.

0

Sulla base @Celada risposta e la @Arthur Zennig, ho creato questo semplice script:

#/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" 
} 
Problemi correlati