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.
@
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.
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}
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
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
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
Il suffit d'utiliser:
file -I <filename>
C'est ça.
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.
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.
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).
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.
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.
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.
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
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.
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.