it-swarm.dev

Jak ustalić kodowanie pliku w OS X?

Próbuję wprowadzić niektóre znaki UTF-8 do pliku LaTeX w TextMate (który mówi, że jego domyślnym kodowaniem jest UTF-8), ale LaTeX wydaje się ich nie rozumieć.

Bieganie cat my_file.tex pokazuje poprawnie znaki w Terminalu. Bieganie ls -al pokazuje coś, czego nigdy wcześniej nie widziałem: „@” na liście plików:

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

(I tak, używam \usepackage[utf8]{inputenc} w LaTeX.)

Znalazłem iconv, ale wydaje mi się, że nie jest w stanie powiedzieć mi, co to jest kodowanie - zostanie przekonwertowane tylko wtedy, gdy go rozgryzę.

162
James A. Rosen

@ Oznacza, że ​​plik ma związane z nim rozszerzone atrybuty pliku. Możesz je wyszukiwać za pomocą funkcji getxattr().

Nie ma określonego sposobu na wykrycie kodowania pliku. Przeczytaj this answer, wyjaśnia dlaczego.

Istnieje narzędzie wiersza polecenia enca , które próbuje odgadnąć kodowanie. Może będziesz chciał to sprawdzić.

33
codelogic

Używając -I (to wielka i) opcja polecenia file wydaje się wyświetlać kodowanie pliku.

file -I {filename}
422
Tim

W Mac OS X polecenie file -I (wielkie i) da ci odpowiedni zestaw znaków, o ile testowany plik zawiera znaki spoza podstawowego ASCII).

Na przykład, jeśli wejdziesz do terminalu i użyjesz vi, aby utworzyć plik, np. vi test.txt następnie wstaw kilka znaków i dołącz znak akcentowany (spróbuj ALT-e, a następnie e), a następnie zapisz plik.

Piszą file -I text.txt i powinieneś otrzymać taki wynik:

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

55
Cloudranger

Możesz także przekonwertować jeden typ pliku na inny za pomocą następującego polecenia:

iconv -f original_charset -t new_charset originalfile > newfile

na przykład.

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

aliasowany gdzieś w mojej konfiguracji bash jako

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

więc po prostu piszę

vic {filename}

W moim systemie waniliowym OSX Yosemite daje bardziej precyzyjne wyniki niż „plik-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

Po prostu użyj:

file -I <filename>

To jest to!.

13
bx2

Za pomocą polecenia file z --mime-encoding opcja (np. file --mime-encoding some_file.txt) zamiast opcji -I działa w systemie OS X i ma tę dodatkową zaletę, że pomija typ MIME „tekst/zwykły”, o który prawdopodobnie nie dbasz.

8
Adam

Klasyczny 8-bitowy LaTeX jest bardzo ograniczony, w których znakach UTF8 może używać; zależy to w dużej mierze od kodowania używanej czcionki i dostępnych glifów.

Ponieważ nie podajesz konkretnego przykładu, trudno jest dokładnie określić, gdzie jest problem - czy próbujesz użyć glifu, którego nie ma Twoja czcionka, czy też nie używasz prawidłowego kodowania czcionki w pierwszym miejsce.

Oto minimalny przykład pokazujący, jak można użyć kilku znaków UTF8 w dokumencie LaTeX:

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

Możesz mieć więcej szczęścia z kodowaniem [utf8x], ale bądź ostrożny, że nie jest już obsługiwany i ma pewne osobliwości w porównaniu z [utf8] (o ile pamiętam; minęło trochę czasu, odkąd na niego spojrzałem). Ale jeśli to załatwi sprawę, tylko to się dla ciebie liczy.

4
Will Robertson

Znak @ oznacza, że ​​plik ma atrybuty rozszerzone . xattr file pokazuje jakie atrybuty ma, xattr -l file pokazuje również wartości atrybutów (które czasami mogą być duże - spróbuj np. xattr /System/Library/Fonts/HelveLTMM, aby zobaczyć czcionkę w starym stylu, która istnieje w rozwidleniu zasobów).

3

Wpisując file myfile.tex w terminalu może czasami powiedzieć kodowanie i typ pliku przy użyciu szeregu algorytmów i magicznych liczb. Jest dość przydatny, ale nie polegaj na nim, ponieważ zapewnia konkretne lub wiarygodne informacje.

A Localizable.strings plik (znaleziony w zlokalizowanych aplikacjach Mac OS X) jest zwykle zgłaszany jako plik źródłowy UTF-16 C.

2
dreamlax

Możesz spróbować załadować plik do okna Firefoksa, a następnie przejść do Widok - kodowanie znaków. Obok typu kodowania pliku powinien znajdować się znacznik wyboru.

1
jmdeamer

Synchronizuj to! pozwala porównać tekst lub bajty we wszystkich kodowaniach biblioteka IC . Korzystając z tej funkcji, zazwyczaj natychmiast widzisz, która strona kodowa ma sens dla twoich danych.

1
pi3

Zaimplementowałem poniższy skrypt bash, który działa dla mnie.

Najpierw próbuje iconv z kodowania zwróconego przez file --mime-encoding do utf-8.

Jeśli to się nie powiedzie, przechodzi przez wszystkie kodowania i pokazuje różnicę między plikiem oryginalnym a ponownie zakodowanym. Pomija kodowanie, które generuje duży wynik różnicowy („duży” zgodnie z definicją MAX_DIFF_LINES zmienna lub drugi argument wejściowy), ponieważ najprawdopodobniej jest to nieprawidłowe kodowanie.

Jeśli w wyniku użycia tego skryptu zdarzają się „złe rzeczy”, nie obwiniaj mnie. Jest rm -f tam, więc są potwory. Próbowałem zapobiec negatywnym skutkom, używając go do plików z losowym przyrostkiem, ale nie składam żadnych obietnic.

Testowane na 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

Z którego LaTeXa korzystasz? Kiedy korzystałem z teTeX, musiałem ręcznie pobrać pakiet nicode i dodać to do moich plików .tex:

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

Teraz przeszedłem na XeTeX z pakietu TeXlive 2008 ( tutaj ), jest to jeszcze prostsze:

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

Jeśli chodzi o wykrywanie kodowania pliku, możesz grać z file(1) (ale jest raczej ograniczony), ale jak ktoś powiedział, jest to trudne.

0
Keltia

Brutalną siłą do sprawdzenia kodowania może być po prostu sprawdzenie pliku w edytorze szesnastkowym lub podobnym. (lub napisz program do sprawdzenia) Spójrz na dane binarne w pliku. Format UTF-8 jest dość łatwy do rozpoznania. Wszystkie znaki ASCII to pojedyncze bajty o wartości poniżej 128 (0x80) sekwencji wielobajtowych zgodne ze wzorem pokazanym na artykuł na wiki

Jeśli możesz znaleźć prostszy sposób, aby uzyskać program do sprawdzenia kodowania dla ciebie, to oczywiście skrót, ale jeśli wszystko inne zawiedzie, to załatwi sprawę.

0
jalf