it-swarm.dev

Como determino a codificação de arquivos no OSX?

Estou tentando inserir alguns caracteres UTF-8 em um arquivo LaTeX no TextMate (que diz que sua codificação padrão é UTF-8), mas o LaTeX não parece entendê-los. Executar cat my_file.tex mostra os caracteres corretamente no Terminal. A execução de ls -al mostra algo que nunca vi antes: um "@" na listagem de arquivos:

[email protected]  1 me      users      2021 Feb 11 18:05 my_file.tex

(E, sim, estou usando \usepackage[utf8]{inputenc} no LaTeX.)

Eu encontrei iconv, mas isso não parece ser capaz de me dizer qual é a codificação - ela só será convertida depois que eu descobrir.

161
James A. Rosen

O @ significa que o arquivo possui atributos de arquivo estendidos associados a ele. Você pode consultá-los usando a função getxattr().

Não há uma maneira definida de detectar a codificação de um arquivo. Leia this answer, isso explica por quê.

Existe uma ferramenta de linha de comando, enca , que tenta adivinhar a codificação. Você pode querer dar uma olhada.

33
codelogic

Usando a opção -I (que é um capital i) no comando file parece mostrar a codificação do arquivo.

file -I {filename}
418
Tim

No Mac OS X, o comando file -I (capital i) fornecerá o conjunto de caracteres apropriado, desde que o arquivo que você está testando contenha caracteres fora do intervalo ASCIIbásico.

Por exemplo, se você entrar no Terminal e usar o vi para criar um arquivo, por exemplo. vi test.txt insira alguns caracteres e inclua um caractere acentuado (tente ALT-e seguido por e) e salve o arquivo.

Eles digitam file -I text.txt e você deve obter um resultado como este:

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

55
Cloudranger

Você também pode converter de um tipo de arquivo para outro usando o seguinte comando:

iconv -f original_charset -t new_charset originalfile > newfile

por exemplo.

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

aliased em algum lugar na minha configuração bash como

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

então eu só digito

vic {filename}

No meu Baunilha OSX Yosemite, ele produz resultados mais precisos do 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
19
jmettraux

Apenas use:

file -I <filename>

É isso aí.

13
bx2

Usar o comando file com a opção --mime-encoding (por exemplo, file --mime-encoding some_file.txt) em vez da opção -I funciona no OS X e tem o benefício adicional de omitir o tipo mime, "text/plain", com o qual você provavelmente não se importa.

8
Adam

O LaTeX clássico de 8 bits é muito restrito em quais caracteres UTF8 ele pode usar; é altamente dependente da codificação da fonte que você está usando e de quais glifos essa fonte tem disponível.

Como você não dá um exemplo específico, é difícil saber exatamente onde está o problema - se você está tentando usar um glifo que sua fonte não possui ou se você não está usando a codificação de fonte correta no primeiro. Lugar, colocar.

Aqui está um exemplo mínimo mostrando como alguns caracteres UTF8 podem ser usados ​​em um documento LaTeX:

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

Você pode ter mais sorte com a codificação [utf8x], mas seja um pouco avisado que não é mais suportado e tem algumas idiossincrasias em comparação com [utf8] (tanto quanto me lembro, já faz um tempo desde que eu olhei para ele). Mas se isso acontecer, é tudo o que importa para você.

4
Will Robertson

O sinal @ significa que o arquivo possui atributos estendidos . xattr file mostra quais atributos ele possui, xattr -l file também mostra os valores dos atributos (que podem ser grandes às vezes - tente, por exemplo, xattr /System/Library/Fonts/HelveLTMM para ver uma fonte antiga que existe na bifurcação de recursos).

3
Jouni K. Seppänen

Digitar file myfile.tex em um terminal pode, às vezes, informar a codificação e o tipo de arquivo usando uma série de algoritmos e números mágicos. É bastante útil, mas não conte com informações concretas ou confiáveis.

Um arquivo Localizable.strings (encontrado em aplicativos do Mac OS X localizados) geralmente é relatado como um arquivo de origem UTF-16C.

2
dreamlax

Você pode tentar carregar o arquivo em uma janela do firefox e ir em Visualizar - Codificação de caracteres. Deve haver uma marca de seleção ao lado do tipo de codificação do arquivo.

1
jmdeamer

Synalyze It! permite comparar texto ou bytes em todas as codificações da biblioteca IC ofertas. Usando esse recurso, você geralmente vê imediatamente qual página de código faz sentido para seus dados.

1
pi3

Eu implementei o script bash abaixo, funciona para mim.

Primeiro tenta iconv da codificação retornada por file --mime-encoding para utf-8.

Se isso falhar, ele passa por todas as codificações e mostra a diferença entre o arquivo original e o recodificado. Ele ignora as codificações que produzem uma saída de diff grande ("grande", conforme definido pela variável MAX_DIFF_LINES ou pelo segundo argumento de entrada), uma vez que essas são provavelmente a codificação incorreta.

Se "coisas ruins" acontecerem como resultado do uso desse script, não me culpe. Há um rm -f lá, então existem monstros. Eu tentei evitar efeitos adversos usando-o em arquivos com um sufixo aleatório, mas não estou fazendo promessas.

Testado em 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

Qual LaTeX você está usando? Quando eu estava usando o teTeX, eu tive que baixar manualmente o pacote nicode e adicionar isto aos meus arquivos .tex:

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

Agora, eu mudei para o XeTeX do pacote TeXlive 2008 ( aqui ), é ainda mais simples:

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

Quanto à detecção da codificação de um arquivo, você poderia tocar com file(1) (mas é bastante limitado), mas como alguém disse, é difícil.

0
Keltia

Uma forma de força bruta para verificar a codificação pode ser apenas para verificar o arquivo em um editor hexadecimal ou similar. (ou escreva um programa para verificar) Veja os dados binários no arquivo. O formato UTF-8 é bastante fácil de reconhecer. Todos os caracteres ASCII são bytes únicos com valores abaixo de 128 (0x80) Sequências multibyte seguem o padrão mostrado no artigo wiki

Se você puder encontrar uma maneira mais simples de obter um programa para verificar a codificação, isso obviamente é um atalho, mas se tudo mais falhar, isso funcionará.

0
jalf