Come posso determinare la codifica dei file in OS X?


171

Sto cercando di inserire alcuni caratteri UTF-8 in un file LaTeX in TextMate (che dice che la sua codifica predefinita è UTF-8), ma LaTeX non sembra capirli.

In esecuzione cat my_file.texmostra correttamente i personaggi nel Terminale. La corsa ls -almostra qualcosa che non ho mai visto prima: un "@" dalla lista dei file:

-rw-r--r--@  1 me      users      2021 Feb 11 18:05 my_file.tex

(E, sì, sto usando \usepackage[utf8]{inputenc}in LaTeX.)

Ho scoperto iconv, ma questo non sembra essere in grado di dirmi qual è la codifica - si convertirà solo dopo averlo capito.


Nella mia esperienza, il comando file (1) è sempre stato abbastanza bravo a indovinare la codifica di un file. Non so se sia abbastanza intelligente da usare l'attributo esteso com.apple.TextEncoding del file.
Edward Falk,

Risposte:


33

Ciò @significa che al file sono stati associati attributi di file estesi. Puoi interrogarli usando la getxattr()funzione.

Non esiste un modo definito per rilevare la codifica di un file. Leggi questa risposta, spiega perché.

C'è uno strumento da riga di comando, enca , che tenta di indovinare la codifica. Potresti voler dare un'occhiata.


1
Supponevo che OSX memorizzasse la codifica come metadati. Ho capito che il contenuto del file era solo un cluster di bit e non aveva una codifica intrinseca.
James A. Rosen,

1
@ JamesA.Rosen Le app OS X come TextEdit memorizzano la codifica dei file come attributo (denominata "com.apple.TextEncoding"). È abbastanza probabile che gli attributi indicati @includano l'attributo di codifica del file. È possibile utilizzare il comando xattr -p com.apple.TextEncoding <filename>per esaminare l'attributo di codifica se esiste.
bames53,

1
puoi per favore spiegare come usare getxattr? Non sono in grado di usarlo.
MeV

1
Questa è una chiamata di funzione che useresti se vuoi scrivere un programma. Dalla riga di comando, basta digitare ls -l@ <filename>per vedere quali attributi sono impostati per il file. Per vedere l'attributo effettivo, digitarexattr -p com.apple.TextEncoding <filename>
Edward Falk

Per encafarcela brew install encae devi specificare la lingua ma nessuna funziona, quindi:enca FILENAME -L __
Shane,

434

L'uso -Idell'opzione (che è una maiuscola i) sul comando file sembra mostrare la codifica del file.

file -I {filename}

58
Avevo bisogno di usare -I
Casebash il

7
Questa funzione sembrava non essere in grado di dire la differenza tra ASCII e UTF-8 (sembra che siano gli stessi per la maggior parte dei caratteri statunitensi, ma non tutti, forse qualcosa che rileverebbe il bit unicode)
BadPirate,

14
ASCII e UTF8 sono uguali a meno che non ci sia un carattere oltre OxFF nel file o una DBA.
davidtbernal,

3
file -I *sembra funzionare perfettamente per me (su OSX). Un sistema si è lamentato della codifica di uno dei molti file, senza specificare quale. Tutti i file erano ascii, tranne uno, che era utf-8. Molto probabilmente il colpevole.
mcv,

1
@notJim È errato. ASCII è definito solo attraverso 0x7F, quindi qualsiasi cosa oltre quel punto non è chiaramente ASCII. Unicode e Latin-1 hanno gli stessi punti di codice in 0x80-0xFF ma non esiste una codifica comune di Unicode che è identica a Latin-1 (perché sarebbe intrinsecamente limitata a 8 bit, che è troppo piccola per Unicode).
Tripleee,

56

In Mac OS X il comando file -I(maiuscolo i) ti fornirà il set di caratteri corretto fintanto che il file che stai testando contiene caratteri al di fuori dell'intervallo ASCII di base.

Ad esempio, se vai in Terminale e usi vi per creare un file, ad es. vi test.txt quindi inserire alcuni caratteri e includere un carattere accentato (provare ALT-e seguito da e) quindi salvare il file.

Digitano file -I text.txte dovresti ottenere un risultato come questo:

test.txt: text/plain; charset=utf-8


3
Posso confermare il caso OS X, charset = us-ascii o charset = utf-8 a seconda del contenuto del file
Ben

ma sembra solo guardare i primi pochi KB del file. nel mio caso, il comando vim su stackoverflow.com/a/33644535/161022 ha identificato correttamente il file come utf-8 mentre il filecomando afferma di essereus-ascii
lmsurprenant

In effetti, sembra che il file trucchi per motivi di prestazioni. Ho appena creato un file ASCII da 3 MB su Ubuntu e aggiunto alcuni caratteri UTF-8 alla fine e riporta ancora ASCII non UTF-8. Ho provato l'opzione -k (continua) ma poi riporta "dati" e non "UTF-8", quindi ancora non va bene.
Cloudranger

24
vim -c 'execute "silent !echo " . &fileencoding | q' {filename}

alias da qualche parte nella mia configurazione bash come

alias vic="vim -c 'execute \"silent !echo \" . &fileencoding | q'"

quindi scrivo e basta

vic {filename}

Sul mio OSX Yosemite vaniglia, produce risultati più precisi di "file -I":

$ file -I pdfs/udocument0.pdf
pdfs/udocument0.pdf: application/pdf; charset=binary
$ vic pdfs/udocument0.pdf
latin1
$
$ file -I pdfs/t0.pdf
pdfs/t0.pdf: application/pdf; charset=us-ascii
$ vic pdfs/t0.pdf
utf-8

1
Questa è l'unica risposta che mi ha dato ciò di cui avevo bisogno: "latin1", al contrario di "us-ascii". Tuttavia, ho dovuto rimuovere le barre rovesciate.
Katy Lavallee,

Grazie mille, ho rimosso le barre rovesciate.
jmettraux,

21

Puoi anche convertire da un tipo di file a un altro usando il seguente comando:

iconv -f original_charset -t new_charset originalfile > newfile

per esempio

iconv -f utf-16le -t utf-8 file1.txt > file2.txt

13

Usa solo:

file -I <filename>

Questo è tutto.


2
Non posso preoccuparmi di votare in basso, ma questa risposta è completamente sbagliata. Piccolo -i dice di non classificare i contenuti se si tratta di un file normale. -I equivale a --mime che genera stringhe di tipo mime. Gli strumenti osx si comportano diversamente dagli strumenti standard di Linux.
sillyMunky,

Bene, per un file codificato di Windows 1252 file -Imi prende text/plain; charset=unknown-8bit. Anche se funziona meglio per un file utf8: text/plain; charset=utf-8.
MiB

8

L'uso del filecomando con l' --mime-encodingopzione (ad es. file --mime-encoding some_file.txt) Invece dell'opzione -I funziona su OS X e ha l'ulteriore vantaggio di omettere il tipo mime, "text / plain", che probabilmente non ti interessa.


ls -l @ a mostrerà gli attributi estesi . Guardando la pagina man per ls su Yosemite, non vedo un'opzione di codifica --mime.
rstackhouse,

Stavi parlando del filecomando. Non sapevo che ne esistesse uno. Novizio. Comunque. Mi dispiace per il downvote. SO non mi lascerà annullare a meno che qualcuno non modifichi questa risposta.
rstackhouse,

4

Il classico LaTeX a 8 bit è molto limitato in quali caratteri UTF8 può usare; dipende fortemente dalla codifica del carattere che stai utilizzando e da quali glifi hanno quel carattere disponibile.

Dal momento che non fornisci un esempio specifico, è difficile sapere esattamente dove si trova il problema: se stai tentando di utilizzare un glifo che non ha il tuo carattere o se non stai utilizzando la codifica corretta del carattere nel primo posto.

Ecco un esempio minimo che mostra come è possibile utilizzare alcuni caratteri UTF8 in un documento LaTeX:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[utf8]{inputenc}
\begin{document}
‘Héllø—thêrè.’
\end{document}

Potresti avere più fortuna con la codifica [utf8x], ma devi essere leggermente avvisato che non è più supportato e ha alcune idiosincrasie rispetto a [utf8] (per quanto ricordo, è passato un po 'di tempo da quando l'ho visto). Ma se lo fa, è tutto ciò che conta per te.


3

Il segno @ indica che il file ha attributi estesi . xattr filemostra quali attributi ha, xattr -l filemostra anche i valori degli attributi (che a volte possono essere grandi - prova ad esempio xattr /System/Library/Fonts/HelveLTMMa vedere un carattere vecchio stile che esiste nel fork delle risorse).


2

Digitare file myfile.texun terminale a volte può dirti la codifica e il tipo di file usando una serie di algoritmi e numeri magici. È abbastanza utile ma non fare affidamento sul fatto che fornisce informazioni concrete o affidabili.

Un Localizable.stringsfile (che si trova nelle applicazioni localizzate di Mac OS X) viene in genere segnalato come un file sorgente UTF-16 C.


1

Synalyze It! consente di confrontare testo o byte in tutte le codifiche offerte dalla libreria ICU . Usando quella funzione di solito vedi immediatamente quale codepage ha senso per i tuoi dati.


1

Puoi provare a caricare il file in una finestra di Firefox, quindi vai a Visualizza - Codifica caratteri. Dovrebbe essere presente un segno di spunta accanto al tipo di codifica del file.


0

Quale LaTeX stai usando? Quando stavo usando teTeX, ho dovuto scaricare manualmente il pacchetto Unicode e aggiungerlo ai miei file .tex:

% UTF-8 stuff
\usepackage[notipa]{ucs}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}

Ora sono passato a XeTeX dal pacchetto TeXlive 2008 ( qui ), è ancora più semplice:

% UTF-8 stuff
\usepackage{fontspec}
\usepackage{xunicode}

Per quanto riguarda il rilevamento della codifica di un file, potresti giocare file(1)(ma è piuttosto limitato) ma, come ha detto qualcun altro, è difficile.


0

Un modo bruto per controllare la codifica potrebbe essere semplicemente quello di controllare il file in un editor esadecimale o simile. (o scrivi un programma per controllare) Guarda i dati binari nel file. Il formato UTF-8 è abbastanza facile da riconoscere. Tutti i caratteri ASCII sono byte singoli con valori inferiori a 128 (0x80) Le sequenze multibyte seguono il modello mostrato nell'articolo wiki

Se riesci a trovare un modo più semplice per ottenere un programma per verificare la codifica per te, questo è ovviamente un collegamento, ma se tutto il resto fallisce, questo farebbe il trucco.


0

Ho implementato lo script bash di seguito, funziona per me.

Per prima cosa tenta di eseguire iconvla codifica restituita da file --mime-encodinga utf-8.

Se fallisce, passa attraverso tutte le codifiche e mostra la differenza tra il file originale e quello ricodificato. Salta le codifiche che producono un output diff di grandi dimensioni ("large" come definito dalla MAX_DIFF_LINESvariabile o dal secondo argomento di input), poiché è molto probabile che queste abbiano una codifica errata.

Se "cose ​​cattive" si verificano a seguito dell'utilizzo di questo script, non incolparmi. C'è un rm -fdentro, quindi ci sono mostri. Ho cercato di prevenire effetti avversi utilizzandolo su file con un suffisso casuale, ma non sto promettendo nulla.

Testato su Darwin 15.6.0.

#!/bin/bash

if [[ $# -lt 1 ]]
then
  echo "ERROR: need one input argument: file of which the enconding is to be detected."
  exit 3
fi

if [ ! -e "$1" ]
then
  echo "ERROR: cannot find file '$1'"
  exit 3
fi

if [[ $# -ge 2 ]]
then
  MAX_DIFF_LINES=$2
else
  MAX_DIFF_LINES=10
fi


#try the easy way
ENCOD=$(file --mime-encoding $1 | awk '{print $2}')
#check if this enconding is valid
iconv -f $ENCOD -t utf-8 $1 &> /dev/null
if [ $? -eq 0 ]
then
  echo $ENCOD
  exit 0
fi

#hard way, need the user to visually check the difference between the original and re-encoded files
for i in $(iconv -l | awk '{print $1}')
do
  SINK=$1.$i.$RANDOM
  iconv -f $i -t utf-8 $1 2> /dev/null > $SINK
  if [ $? -eq 0 ]
  then
    DIFF=$(diff $1 $SINK)
    if [ ! -z "$DIFF" ] && [ $(echo "$DIFF" | wc -l) -le $MAX_DIFF_LINES ]
    then
      echo "===== $i ====="
      echo "$DIFF"
      echo "Does that make sense [N/y]"
      read $ANSWER
      if [ "$ANSWER" == "y" ] || [ "$ANSWER" == "Y" ]
      then
        echo $i
        exit 0
      fi
    fi
  fi
  #clean up re-encoded file
  rm -f $SINK
done

echo "None of the encondings worked. You're stuck."
exit 3
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.