Comment puis-je déterminer l'encodage des fichiers dans OSX?

j'essaie d'entrer quelques caractères UTF-8 dans un fichier LaTeX dans TextMate (qui dit que son encodage par défaut est UTF-8), mais LaTeX ne semble pas les comprendre. L'exécution de cat my_file.tex montre les caractères correctement dans le Terminal. Exécuter ls -al montre quelque chose que je n'ai jamais vu avant: un " @ "par la liste de fichier:

-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 pour pouvoir me dire ce qu'est l'encodage -- il ne se convertira qu'une fois que je l'aurai trouvé.

152
demandé sur Keltia 2009-02-12 02:11:05

15 réponses

le @ signifie que le fichier a des attributs de fichier étendus qui lui sont associés. Vous pouvez les interroger en utilisant la fonction getxattr() .

il n'y a aucun moyen défini pour détecter l'encodage d'un fichier. Lire ce en réponse, il explique pourquoi.

il y a un outil en ligne de commande, enca , qui tente de deviner l'encodage. Vous pourriez vouloir vérifier.

33
répondu codelogic 2017-05-23 11:54:47

en utilisant l'option -I (c'est un capital i) sur la commande file semble afficher le codage du fichier.

file -I {filename}
397
répondu Tim 2013-05-28 17:21:24

dans Mac OS X la commande file -I (capital i) vous donnera le jeu de caractères approprié tant que le fichier que vous testez contient des caractères en dehors de la plage ascii de base.

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

tapez file -I text.txt et vous devriez obtenir un résultat comme ceci:

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

53
répondu Cloudranger 2014-05-18 16:41:46

vous pouvez également convertir un type de fichier en un autre en utilisant la commande suivante:

iconv -f original_charset -t new_charset originalfile > newfile

p.ex.

iconv -f utf-16le -t utf-8 file1.txt > file2.txt
20
répondu RPM 2011-05-26 22:59:44
vim -c 'execute "silent !echo " . &fileencoding | q' {filename}

alias quelque part dans mon bash configuration

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

alors je n'ai qu'à taper

vic {filename}

sur mon Yosémite vanille OSX, il donne des résultats plus précis que "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
18
répondu jmettraux 2016-01-25 22:02:29

il suffit d'utiliser:

file -I <filename>

C'est ça.

13
répondu bx2 2013-05-02 20:48:36

utilisant file avec l'option --mime-encoding (par exemple file --mime-encoding some_file.txt ) au lieu de l'option-I fonctionne sur OS X et a l'avantage supplémentaire d'omettre le type mime," text/plain", dont vous ne vous souciez probablement pas.

6
répondu Adam 2015-04-02 18:39:19

Classic 8-bit LaTeX est très restreint dans quels caractères UTF8 il peut utiliser; il est fortement dépendant de l'encodage de la police que vous utilisez et quels glyphes que la police a disponible.

comme vous ne donnez pas d'exemple précis, il est difficile de savoir exactement où est le problème - si vous essayez d'utiliser un glyphe que votre police n'a pas ou si vous n'utilisez pas le bon codage de police en premier lieu.

voici un minimum exemple montrant comment quelques caractères UTF8 peuvent être utilisés 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 supporté et a quelques idiosyncrasies par rapport à [utf8] (autant que je me souvienne, ça fait longtemps que je ne l'ai pas regardé). Mais si elle ne le truc, c'est tout ce qui compte pour vous.

4
répondu Will Robertson 2009-02-11 23:48:11

Le signe @ signifie que le fichier a attributs étendus . xattr file montre les attributs qu'il a, xattr -l file montre les valeurs d'attribut trop (qui peuvent être grandes parfois - essayez par exemple xattr /System/Library/Fonts/HelveLTMM pour voir un vieux style de police qui existe dans la fourchette de ressources).

3
répondu Jouni K. Seppänen 2009-02-12 06:38:08

taper file myfile.tex dans un terminal peut parfois vous dire l'encodage et le type de fichier en utilisant une série d'algorithmes et de nombres magiques. C'est assez utile, mais ne comptez pas sur elle pour fournir des informations concrètes ou fiables.

Le fichier

A Localizable.strings (trouvé dans les applications Mac OS X localisées) est généralement considéré comme un fichier source UTF-16C.

2
répondu dreamlax 2009-03-08 09:50:05

Synalyze It! permet de comparer le texte ou les octets dans tous les encodages de la bibliothèque ICU offres. En utilisant cette fonctionnalité, vous voyez généralement immédiatement quelle page de code a du sens pour vos données.

1
répondu pi3 2013-06-18 04:00:16

vous pouvez essayer de charger le fichier dans une fenêtre firefox puis aller à view - Character Encoding. Il devrait y avoir un crochet à côté du type d'encodage du fichier.

1
répondu jmdeamer 2014-03-04 23:36:27

quel LaTeX utilisez-vous? Lorsque j'utilisais teTeX, j'ai dû télécharger manuellement le paquet unicode et l'ajouter à mon .fichiers tex:

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

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

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

Que pour la détection de l'encodage d'un fichier, vous pouvez jouer avec file(1) (mais c'est assez limité), mais comme quelqu'un d'autre dit, c'est difficile.

0
répondu Keltia 2009-02-11 23:31:42

une façon brute-force de vérifier l'encodage pourrait simplement être de vérifier le fichier dans un éditeur hex ou similaire. (ou écrire 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 multibytes suivent le modèle montré dans l'article wiki

Si vous pouvez trouver un moyen plus simple d'obtenir un programme pour vérifier l'encodage pour vous, qui est évidemment un raccourci, mais si tout le reste échoue, cela ferait l'affaire.

0
répondu jalf 2009-02-11 23:38:32

j'ai implémenté le script bash ci-dessous, ça marche pour moi.

il essaie d'abord de iconv à partir de l'encodage retourné par file --mime-encoding à utf-8 .

si cela échoue, il passe en revue tous les encodages et affiche la différence entre le fichier original et le fichier ré-encodé. Il saute sur les encodages qui produisent une grande différence de sortie ("large" comme défini par la variable MAX_DIFF_LINES ou le deuxième argument d'entrée), car ceux-ci sont très probablement mauvais encodage.

si "de mauvaises choses" se produisent à la suite de l'utilisation de ce script, ne me blâmez pas. Il y a un rm -f là-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 "" ]
then
  echo "ERROR: cannot find file ''"
  exit 3
fi

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


#try the easy way
ENCOD=$(file --mime-encoding  | awk '{print }')
#check if this enconding is valid
iconv -f $ENCOD -t utf-8  &> /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 }')
do
  SINK=.$i.$RANDOM
  iconv -f $i -t utf-8  2> /dev/null > $SINK
  if [ $? -eq 0 ]
  then
    DIFF=$(diff  $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
répondu Joao Encarnacao 2017-06-09 19:58:27