Как определить кодировку файлов в OSX?
Я пытаюсь ввести некоторые символы UTF-8 в файл LaTeX в TextMate (который говорит, что его кодировка по умолчанию-UTF-8), но LaTeX, похоже, не понимает их. Бег!--1--> показывает символы правильно в терминале. Бег!--2--> показывает то, что я никогда не видел раньше: "@ " в файл выглядит так:
-rw-r--r--@ 1 me users 2021 Feb 11 18:05 my_file.tex
(и, да, я использую usepackage[utf8]{inputenc}
в латекс.)
я нашел iconv
, но это, похоже, не может сказать мне, что такое кодировка -- он изменится, только когда я это выясню.
15 ответов
на @
означает, что файл имеет расширенные атрибуты файлов, связанных с ним. Вы можете запросить их с помощью
С помощью -I
(это заглавная i) опция в команде file, кажется, показывает кодировку файла.
file -I {filename}
в Mac OS X команда file -I
(capital i) даст вам правильный набор символов, пока файл, который вы тестируете, содержит символы за пределами основного диапазона ASCII.
например, если вы заходите в терминал и используете vi для создания файла, например. vi test.txt
затем вставьте несколько символов и включите акцентированный символ (попробуйте ALT-e, а затем e)
затем сохраните файл.
они типа file -I text.txt
и вы должны получить такой результат:
test.txt: text/plain; charset=utf-8
вы также можете конвертировать из одного типа файлов в другой, используя следующую команду:
iconv -f original_charset -t new_charset originalfile > newfile
например
iconv -f utf-16le -t utf-8 file1.txt > file2.txt
vim -c 'execute "silent !echo " . &fileencoding | q' {filename}
aliased где-то в моей конфигурации bash как
alias vic="vim -c 'execute \"silent !echo \" . &fileencoding | q'"
поэтому я просто набираю
vic {filename}
на моем ванильном OSX Yosemite он дает более точные результаты, чем "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
используя с (например,file --mime-encoding some_file.txt
) вместо опции-I работает на OS X и имеет дополнительное преимущество, опуская тип mime, "text/plain", о котором вы, вероятно, не заботитесь.
классический 8-битный LaTeX очень ограничен в том, какие символы UTF8 он может использовать; это сильно зависит от кодировки шрифта, который вы используете, и какие глифы этот шрифт доступен.
поскольку вы не даете конкретный пример, трудно точно знать, где проблема - пытаетесь ли вы использовать глиф, которого нет у вашего шрифта, или вы не используете правильную кодировку шрифта в первую очередь.
вот минимальный пример, показывающий, как в документе LaTeX можно использовать несколько символов UTF8:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[utf8]{inputenc}
\begin{document}
‘Héllø—thêrè.’
\end{document}
вам может повезти с кодировкой [utf8x], но будьте немного предупреждены, что она больше не поддерживается и имеет некоторые особенности по сравнению с [utf8] (насколько я помню, прошло некоторое время с тех пор, как я смотрел на нее). Но если это поможет, это все, что имеет значение для тебя.
символ " @ " означает, что файл имеет расширенные атрибуты. xattr file
показывает, какие атрибуты она имеет, xattr -l file
также показывает значения атрибутов (которые иногда могут быть большими-попробуйте, например,xattr /System/Library/Fonts/HelveLTMM
чтобы увидеть шрифт старого стиля, который существует в вилке ресурсов).
введя file myfile.tex
в терминале иногда могу сказать вам кодировку и тип файла, используя ряд алгоритмов и магических чисел. Это довольно полезно, но не полагайтесь на него, предоставляя конкретную или достоверную информацию.
A Localizable.strings
файл (найден в локализованных приложениях Mac OS X) обычно сообщается, что это исходный файл UTF-16 C.
Synalyze Его! позволяет сравнивать текст или байты во всех кодировках в библиотека ICU предложения. Используя эту функцию, вы обычно сразу видите, какая кодовая страница имеет смысл для ваших данных.
вы можете попробовать загрузить файл в окно firefox, а затем перейти к кодировке View-Character. Рядом с типом кодировки файла должен быть флажок.
какой латекс вы используете? Когда я использовал teTeX, мне пришлось вручную загрузить unicode пакет и добавьте это в мой .файлы Tex:
% UTF-8 stuff
\usepackage[notipa]{ucs}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
Теперь я переключился на XeTeX из пакета TeXlive 2008 (здесь), еще проще:
% UTF-8 stuff
\usepackage{fontspec}
\usepackage{xunicode}
Что касается обнаружения кодировки файла, вы можете играть с file(1)
(но он довольно ограничен), но, как сказал кто-то другой, это сложно.
грубым способом проверки кодировки может быть просто проверка файла в шестнадцатеричном редакторе или аналогичном. (или напишите программу для проверки) посмотрите на двоичные данные в файле. Формат UTF-8 довольно легко распознать. Все символы ASCII являются одиночными байтами со значениями ниже 128 (0x80) Многобайтовые последовательности следуют шаблону, показанному в статьи
Если вы можете найти более простой способ получить программу для проверки кодировки для вас, это, очевидно, ярлык, но если все остальное не сработает,это сработает.
я реализовал сценарий bash ниже, он работает для меня.
он сначала пытается iconv
из кодировки, возвращенной file --mime-encoding
to utf-8
.
если это не удается, он проходит через все кодировки и показывает разницу между оригиналом и перекодируется файл. Он пропускает кодировки, которые производят большой выход diff ("большой", как определено MAX_DIFF_LINES
переменной или второй входной аргумент), так как это скорее всего неправильная кодировка.
если "плохие вещи" произойти в результате использования этого скрипта, не вини меня. Есть rm -f
там, так что есть монстры. Я пытался предотвратить неблагоприятные последствия, используя его для файлов со случайным суффиксом, но я не даю никаких обещаний.
протестировано на 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 "" ]
then
echo "ERROR: cannot find file ''"
exit 3
fi
if [[ $# -ge 2 ]]
then
MAX_DIFF_LINES=
else
MAX_DIFF_LINES=10
fi
#try the easy way
ENCOD=$(file --mime-encoding | awk '{print }')
#check if this enconding is valid
iconv -f $ENCOD -t utf-8 &> /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 }')
do
SINK=.$i.$RANDOM
iconv -f $i -t utf-8 2> /dev/null > $SINK
if [ $? -eq 0 ]
then
DIFF=$(diff $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