Comment déterminer le codage des fichiers sous OS X?


171

J'essaie d'entrer des 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 cat my_file.texmontre correctement les caractères dans le terminal. L'exécution ls -almontre quelque chose que je n'ai jamais vu auparavant: un "@" dans la liste des 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 quel est l'encodage - il ne sera converti qu'une fois que je le comprendrai.


D'après mon expérience, la commande file (1) a toujours été assez efficace pour deviner l'encodage d'un fichier. Je ne sais pas si c'est assez intelligent pour utiliser l'attribut étendu com.apple.TextEncoding du fichier ou non.
Edward Falk

Réponses:


33

Les @moyens que le fichier comporte un fichier d' attributs étendus associés. Vous pouvez les interroger à l'aide de la getxattr()fonction.

Il n'y a pas de moyen défini de détecter l'encodage d'un fichier. Lisez cette réponse, elle explique pourquoi.

Il existe un outil de ligne de commande, enca , qui tente de deviner l'encodage. Vous voudrez peut-être le vérifier.


1
Je supposais qu'OSX stockait l'encodage sous forme de méta-données. J'ai compris que le contenu du fichier n'était qu'un groupe de bits et n'avait aucun codage inhérent.
James A. Rosen

1
@ Les applications JamesA.Rosen OS X comme TextEdit stockent l'encodage des fichiers sous forme d'attribut (nommé "com.apple.TextEncoding"). Il est fort probable que les attributs indiqués par cela @incluent l'attribut de codage de fichier. Vous pouvez utiliser la commande xattr -p com.apple.TextEncoding <filename>pour examiner l'attribut de codage s'il existe.
bames53

1
pouvez-vous s'il vous plaît expliquer comment utiliser getxattr? Je ne peux pas m'en servir.
MeV

1
C'est un appel de fonction que vous utiliseriez si vous souhaitez écrire un programme. À partir de la ligne de commande, tapez simplement ls -l@ <filename>pour voir quels attributs sont définis pour le fichier. Pour voir l'attribut réel, tapezxattr -p com.apple.TextEncoding <filename>
Edward Falk

Pour encafaire brew install encaet vous devez spécifier la langue mais aucune ne fonctionne, donc:enca FILENAME -L __
Shane

434

L'utilisation de l' -Ioption (c'est un i majuscule) sur la commande de fichier semble afficher le codage du fichier.

file -I {filename}

58
J'avais besoin d'utiliser -I
Casebash

7
Cette fonction semblait incapable de faire la différence entre ASCII et UTF-8 (il semble qu'ils soient les mêmes pour la plupart des caractères américains, mais pas tous, peut-être quelque chose qui détecterait le bit unicode)
BadPirate

14
ASCII et UTF8 sont identiques à moins qu'il n'y ait un caractère au-delà d'OxFF dans le fichier, ou une nomenclature.
davidtbernal

3
file -I *semble fonctionner parfaitement pour moi (sur OSX). Un système s'est plaint de l'encodage de l'un des nombreux fichiers, sans préciser lequel. Tous les fichiers étaient ascii, sauf un, qui était utf-8. Très probablement le coupable.
mcv

1
@notJim C'est incorrect. ASCII n'est défini que via 0x7F, donc tout ce qui dépasse ce point n'est clairement pas ASCII. Unicode et Latin-1 ont les mêmes points de code dans 0x80-0xFF mais il n'y a pas de codage commun d'Unicode qui est identique à Latin-1 (car cela serait intrinsèquement limité à 8 bits, ce qui est beaucoup trop peu pour Unicode).
tripleee du

56

Sous Mac OS X, la commande file -I(i majuscule) 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.

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

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


3
Je peux confirmer le cas OS X, charset = us-ascii ou charset = utf-8 selon le contenu du fichier
Ben

mais il ne semble regarder que les premiers Ko du fichier. dans mon cas, la commande vim sur stackoverflow.com/a/33644535/161022 a correctement identifié le fichier comme utf-8 alors que la filecommande revendique sonus-ascii
lmsurprenant

En effet, il semble que ce fichier triche pour des raisons de performances. Je viens de créer un fichier ASCII 3MB sur Ubuntu et j'ai ajouté quelques caractères UTF-8 à la fin et il rapporte toujours ASCII et non UTF-8. J'ai essayé l'option -k (continuez) mais ensuite il rapporte "data" et non "UTF-8" donc toujours pas bon.
Cloudranger

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

alias quelque part dans ma configuration bash comme

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

alors je tape juste

vic {filename}

Sur mon OSX Yosemite vanille, 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

1
C'est la seule réponse qui m'a donné ce dont j'avais besoin - "latin1", par opposition à "us-ascii". Cependant, j'ai dû supprimer les barres obliques inverses.
katy lavallee

Merci beaucoup, j'ai supprimé les contre-obliques.
jmettraux

21

Vous pouvez également convertir d'un type de fichier à 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

13

Utilisez simplement:

file -I <filename>

C'est tout.


2
Je ne peux pas être dérangé de voter contre, mais cette réponse est complètement fausse. Petit -i indique de ne pas classer le contenu s'il s'agit d'un fichier normal. -I équivaut à --mime qui génère des chaînes de type mime. Les outils osx se comportent différemment des outils Linux standard.
sillyMunky

Eh bien, pour un fichier encodé Windows 1252, file -Iça me fait text/plain; charset=unknown-8bit. Bien que cela fonctionne mieux pour un fichier UTF8: text/plain; charset=utf-8.
MiB

8

Utiliser la filecommande avec l' --mime-encodingoption (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.


ls -l @ a affichera les attributs étendus . En regardant la page de manuel de ls sur Yosemite, je ne vois pas d'option --mime-encoding.
rstackhouse

Vous parliez de la filecommande. Je ne savais pas que l'un existait. Noob. En tous cas. Désolé pour le vote négatif. Donc, ne me laisse pas l'annuler à moins que quelqu'un ne modifie cette réponse.
rstackhouse

4

Le LaTeX 8 bits classique est très limité dans les caractères UTF8 qu'il peut utiliser; cela dépend fortement de l'encodage de la police que vous utilisez et des glyphes disponibles pour cette police.

Comme 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 le bon encodage de police dans le premier endroit.

Voici un exemple minimal 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 qu'il a quelques particularités par rapport à [utf8] (pour autant que je me souvienne; ça fait un moment que je ne l'ai pas regardé). Mais si cela fait l'affaire, c'est tout ce qui compte pour vous.


3

Le signe @ signifie que le fichier a des attributs étendus . xattr filemontre quels attributs il a, xattr -l filemontre aussi les valeurs d'attribut (qui peuvent parfois être grandes - essayez par exemple xattr /System/Library/Fonts/HelveLTMMde voir une police à l'ancienne qui existe dans la fourchette de ressources).


2

Taper file myfile.texdans 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 comptez pas sur lui pour fournir des informations concrètes ou fiables.

Un Localizable.stringsfichier (trouvé dans les applications Mac OS X localisées) est généralement signalé comme un fichier source UTF-16 C.



1

Vous pouvez essayer de charger le fichier dans une fenêtre de Firefox, puis aller dans Affichage - Encodage de caractères. Il doit y avoir une coche à côté du type de codage du fichier.


0

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

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

Maintenant, je suis passé à XeTeX depuis le package TeXlive 2008 ( ici ), c'est encore plus simple:

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

Quant à la détection de l'encodage d'un fichier, vous pourriez jouer avec file(1)(mais c'est assez limité) mais comme quelqu'un l'a dit, c'est difficile.


0

Un moyen brutal de vérifier l'encodage pourrait simplement être de vérifier le fichier dans un éditeur hexadécimal ou similaire. (ou écrivez un programme pour 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 l' article du wiki

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


0

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

Il essaie d'abord de iconvpartir du codage renvoyé par file --mime-encodingto utf-8.

Si cela échoue, il passe par tous les encodages et affiche la différence entre le fichier d'origine et le fichier réencodé. Il saute les encodages qui produisent une sortie diff importante («large» comme défini par la MAX_DIFF_LINESvariable ou le deuxième argument d'entrée), car ceux-ci sont probablement le 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 -fdedans, donc il y a des monstres. J'ai essayé d'éviter 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.