Jak określić kodowanie plików w systemie OSX?

Próbuję wprowadzić kilka znaków UTF-8 do pliku LaTeX w TextMate (który mówi, że jego domyślne kodowanie to UTF-8), ale LaTeX chyba ich nie rozumie. Uruchomienie cat my_file.tex pokazuje znaki poprawnie w Terminalu. Uruchamianie ls -al pokazuje coś, czego nigdy wcześniej nie widziałem: "@ " przy liście plików:

-rw-r--r--@  1 me      users      2021 Feb 11 18:05 my_file.tex

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

Znalazłem iconv, ale to chyba nie jest w stanie mi powiedzieć, co to jest kodowanie -- przekonwertuje się tylko wtedy, gdy wykażę wyduś to.

Author: Keltia, 2009-02-12

15 answers

@ oznacza, że plik ma rozszerzone atrybuty związane z nim. Można je odpytywać za pomocą funkcji getxattr().

Nie ma określonego sposobu na wykrycie kodowania pliku. Przeczytaj tę odpowiedź , wyjaśnia dlaczego.

Istnieje narzędzie wiersza poleceń, enca, które próbuje odgadnąć kodowanie. Może zechcesz to sprawdzić.

 33
Author: codelogic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:47

Użycie opcji -I (czyli wielkiej litery i) w poleceniu file wydaje się pokazywać kodowanie pliku.

file -I {filename}
 397
Author: Tim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-28 17:21:24

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

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

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

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

 53
Author: Cloudranger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-18 16:41:46

Możesz również konwertować z jednego typu pliku na inny za pomocą następującego polecenia:

iconv -f original_charset -t new_charset originalfile > newfile

Np.

iconv -f utf-16le -t utf-8 file1.txt > file2.txt
 20
Author: RPM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-26 22:59:44
vim -c 'execute "silent !echo " . &fileencoding | q' {filename}

Aliased somewhere in my bash configuration as

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

Więc po prostu wpisuję

vic {filename}

Na moim vanilla OSX Yosemite daje dokładniejsze wyniki niż "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
 18
Author: jmettraux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-25 22:02:29

Po prostu użyj:

file -I <filename>
To wszystko.
 13
Author: bx2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-02 20:48:36

Użycie polecenia file z opcją --mime-encoding (np. file --mime-encoding some_file.txt) zamiast opcji-I działa na OS X i ma dodatkową zaletę pominięcia typu MIME, "text/plain", który prawdopodobnie cię nie obchodzi.

 6
Author: Adam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-02 18:39:19

Klasyczny 8-bitowy LaTeX jest bardzo ograniczony, w których znakach UTF8 może używać; jest wysoce zależny od kodowania używanej czcionki i jakie glify ma dostępna czcionka.

Ponieważ nie podajesz konkretnego przykładu, trudno jest dokładnie wiedzieć, gdzie jest problem - czy próbujesz użyć glifu, którego nie ma twoja czcionka, czy nie używasz poprawnego kodowania czcionki.

Oto minimalny przykład pokazujący jak kilka UTF8 znaki mogą być używane 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 ostrzegam, że nie jest już obsługiwane i ma pewne idiosynkrazje w porównaniu z [utf8] (o ile pamiętam; minęło trochę czasu, odkąd na to patrzyłem). Ale jeśli to zadziała, tylko to się dla Ciebie liczy.

 4
Author: Will Robertson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-11 23:48:11

Znak @ oznacza, że plik ma rozszerzone atrybuty . xattr file pokazuje jakie atrybuty posiada, 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 zobaczyć czcionkę w starym stylu, która istnieje w widelcu zasobów).

 3
Author: Jouni K. Seppänen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-12 06:38:08

Wpisanie file myfile.tex w terminalu może czasami powiedzieć kodowanie i typ pliku za pomocą szeregu algorytmów i liczb magicznych. Jest to dość przydatne, ale nie polegaj na dostarczaniu konkretnych lub wiarygodnych informacji.

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

 2
Author: dreamlax,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-08 09:50:05

Synalyze It! pozwala porównywać tekst lub bajty we wszystkich kodowaniach oferowanych przez bibliotekę ICU . Korzystając z tej funkcji zwykle natychmiast widzisz, która strona kodowa ma sens dla Twoich danych.

 1
Author: pi3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-18 04:00:16

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

 1
Author: jmdeamer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-04 23:36:27

Jakiego lateksu używasz? Kiedy używałem teTeX, musiałem ręcznie pobrać pakiet unicode i dodać go do mojego .pliki tex:

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

Teraz przełączyłem się na XeTeX z pakietu TeXlive 2008 ( tutaj ), jest jeszcze prostsze:

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

Jeśli chodzi o wykrywanie kodowania pliku, można grać file(1) (ale jest to raczej ograniczone), ale jak ktoś inny powiedział, Jest to trudne.

 0
Author: Keltia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-11 23:31:42

Brutalnym sposobem sprawdzenia kodowania może być sprawdzenie pliku w edytorze szesnastkowym lub podobnym. (lub napisać program do sprawdzenia) spójrz na dane binarne w pliku. Format UTF-8 jest dość łatwy do rozpoznania. Wszystkie znaki ASCII są pojedynczymi bajtami o wartościach poniżej 128 (0x80) Sekwencje wielobajtowe podążają za wzorcem pokazanym w artykule wiki

Jeśli znajdziesz prostszy sposób, aby uzyskać program do weryfikacji kodowania dla ciebie, to oczywiście skrót, ale jeśli Wszystko inne jeśli się nie uda, to wystarczy.

 0
Author: jalf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-11 23:38:32

Zaimplementowałem skrypt bash poniżej, działa dla mnie.

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

Jeśli to się nie powiedzie, przechodzi przez wszystkie kodowania i pokazuje różnicę między oryginalnym i ponownie zakodowanym plikiem. Pomija kodowania, które wytwarzają duże wyjście diff ("Duże" zdefiniowane przez zmienną MAX_DIFF_LINES lub drugi argument wejściowy), ponieważ są to najprawdopodobniej błędne kodowanie.

Jeśli" złe rzeczy " wydarzą się w wyniku użycia tego scenariusz, nie wiń mnie. Tam jest rm -f, więc są potwory. Próbowałem zapobiec negatywnym skutkom, używając go na plikach 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
Author: Joao Encarnacao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-09 19:58:27