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é.
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.
en utilisant l'option -I
(c'est un capital i) sur la commande file semble afficher le codage du fichier.
file -I {filename}
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
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
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
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.
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.
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).
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.
A Localizable.strings
(trouvé dans les applications Mac OS X localisées) est généralement considéré comme un fichier source UTF-16C.
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.
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.
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.
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.
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