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.
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ć.
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}
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
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
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
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.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.
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.
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).
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.
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.
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.
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.
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.
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
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