web-dev-qa-db-fra.com

Comment déterminer le codage de fichier sous OS X?

J'essaie d'entrer des caractères UTF-8 dans un fichier LaTeX dans TextMate (ce qui indique que son codage par défaut est UTF-8), mais LaTeX ne semble pas les comprendre.

Lancer cat my_file.tex montre les caractères correctement dans Terminal. Lancer ls -al montre quelque chose que je n’ai jamais vu auparavant: un "@" dans la liste de fichiers:

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

(Et oui, j'utilise \usepackage[utf8]{inputenc} dans le LaTeX.)

J'ai trouvé iconv, mais cela ne semble pas pouvoir me dire ce qu'est l'encodage - il ne convertira qu'une fois que je l'aurai compris.

162
James A. Rosen

@ signifie que le fichier est associé à des attributs de fichier étendus. Vous pouvez les interroger à l'aide de la fonction getxattr().

Il n’existe aucun moyen précis de détecter l’encodage d’un fichier. Lire this répondre, cela explique pourquoi.

Il existe un outil en ligne de commande, enca , qui tente de deviner l'encodage. Vous voudrez peut-être y jeter un coup d'œil.

33
codelogic

L'utilisation de l'option -I (c'est une majuscule i) de la commande de fichier semble afficher l'encodage du fichier.

file -I {filename}
422
Tim

Sous Mac OS X, la commande file -I (majuscule i) vous donnera le jeu de caractères approprié tant que le fichier que vous testez contient des caractères situés en dehors de la plage de base ASCII.

Par exemple, si vous allez dans Terminal et utilisez vi pour créer un fichier, par exemple. vi test.txt puis insérez des caractères et ajoutez un caractère accentué (essayez ALT-e suivi de e), puis enregistrez le fichier.

Ils tapent file -I text.txt et vous devriez obtenir un résultat comme celui-ci:

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

55
Cloudranger

Vous pouvez également convertir un type de fichier en un autre à l'aide de la commande suivante:

iconv -f original_charset -t new_charset originalfile > newfile

par exemple.

iconv -f utf-16le -t utf-8 file1.txt > file2.txt
20
RPM
vim -c 'execute "silent !echo " . &fileencoding | q' {filename}

alias quelque part dans ma configuration bash

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

alors je tape juste

vic {filename}

Sur mon OSX Yosemite Vanilla, les résultats sont plus précis que "fichier -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
19
jmettraux

Il suffit d'utiliser:

file -I <filename>

C'est ça.

13
bx2

L'utilisation de la commande file avec l'option --mime-encoding (par exemple, file --mime-encoding some_file.txt) à la place de l'option -I fonctionne sous OS X et présente l'avantage supplémentaire d'omettre le type mime, "text/plain", dont vous ne vous souciez probablement pas.

8
Adam

Le format classique LaTeX 8 bits est très restreint quant aux caractères UTF8 qu’il peut utiliser; cela dépend fortement de l'encodage de la police que vous utilisez et des glyphes disponibles.

Étant donné que vous ne donnez pas d'exemple spécifique, il est difficile de savoir exactement où se situe le problème - si vous essayez d'utiliser un glyphe que votre police n'a pas ou si vous n'utilisez pas l'encodage de police correct dans le premier endroit.

Voici un exemple minimal montrant comment utiliser quelques caractères UTF8 dans un document LaTeX:

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

Vous avez peut-être plus de chance avec l'encodage [utf8x], mais soyez légèrement averti qu'il n'est plus pris en charge et qu'il présente certaines particularités par rapport à [utf8] (si je me souviens bien; cela fait longtemps que je ne l'ai pas encore examiné). Mais si cela réussit, c'est tout ce qui compte pour vous.

4
Will Robertson

Le signe @ signifie que le fichier a attributs étendus . xattr file montre ses attributs, xattr -l file montre également les valeurs d'attribut (qui peut parfois être volumineux - essayez, par exemple, xattr /System/Library/Fonts/HelveLTMM pour voir une police de style ancien qui existe dans la fourche des ressources).

3
Jouni K. Seppänen

Taper file myfile.tex dans un terminal peut parfois vous indiquer le codage et le type de fichier à l'aide d'une série d'algorithmes et de nombres magiques. C'est assez utile, mais ne vous fiez pas à cela pour fournir des informations concrètes ou fiables.

Un fichier Localizable.strings (présent dans les applications Mac OS X localisées) est généralement un fichier source C UTF-16.

2
dreamlax

Vous pouvez essayer de charger le fichier dans une fenêtre firefox, puis aller à View - Character Encoding. Il devrait y avoir une coche à côté du type de codage du fichier.

1
jmdeamer

Synalyze It! permet de comparer du texte ou des octets dans tous les codages, les offres bibliothèque IC . En utilisant cette fonctionnalité, vous voyez habituellement immédiatement quelle page de code a du sens pour vos données.

1
pi3

J'ai implémenté le script bash ci-dessous, cela fonctionne pour moi.

Il essaie d’abord de iconv à partir du codage renvoyé par file --mime-encoding à utf-8.

Si cela échoue, il passe par tous les encodages et affiche le diff entre le fichier d'origine et le fichier réencodé. Il ignore les codages produisant une sortie diff importante ("large" définie par la variable MAX_DIFF_LINES ou le deuxième argument d'entrée), car il s'agit très probablement d'un codage incorrect.

Si "ce qui se passe" résulte de l'utilisation de ce script, ne me blâmez pas. Il y a un rm -f dedans, donc il y a des monstres. J'ai essayé de prévenir les effets indésirables en l'utilisant sur des fichiers avec un suffixe aléatoire, mais je ne fais aucune promesse.

Testé sur 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
0
Joao Encarnacao

Quel LaTeX utilisez-vous? Lorsque j'utilisais teTeX, je devais télécharger manuellement le package nicode et l'ajouter à mes fichiers .tex:

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

Maintenant, je suis passé à XeTeX à partir du paquet TeXlive 2008 ( ici ), c'est encore plus simple:

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

En ce qui concerne la détection de l'encodage d'un fichier, vous pouvez jouer avec file(1) (mais c'est assez limité), mais comme quelqu'un l'a dit, c'est difficile.

0
Keltia

Un moyen brutal de vérifier l'encodage pourrait simplement consister à vérifier le fichier dans un éditeur hexadécimal ou similaire. (ou écrivez un programme à vérifier) ​​Regardez les données binaires dans le fichier. Le format UTF-8 est assez facile à reconnaître. Tous les caractères ASCII sont des octets simples avec des valeurs inférieures à 128 (0x80). Les séquences multi-octets suivent le modèle indiqué dans le article du wiki

Si vous pouvez trouver un moyen plus simple d’obtenir un programme vérifiant l’encodage pour vous, c’est évidemment un raccourci, mais si tout échoue, cela ira très bien.

0
jalf