Как определить кодировку файлов в OSX?
Я пытаюсь ввести некоторые символы UTF-8 в файл LaTeX в TextMate (который говорит, что его кодировка по умолчанию-UTF-8), но LaTeX, похоже, не понимает их. Работает cat my_file.tex показывает символы правильно в терминале. Работает ls -al показывает то, что я никогда не видел раньше: "@ " в файл выглядит так:
-rw-r--r--@ 1 me users 2021 Feb 11 18:05 my_file.tex
(и, да, я использую usepackage[utf8]{inputenc} в латекс.)
я нашел iconv, но это, кажется, не в состоянии сказать мне, что такое кодировка -- он только один раз меня понять.
15 ответов:
The
@означает, что файл имеет расширенные атрибуты файлов, связанных с ним. Вы можете запросить их с помощью
С помощью
-I(это заглавная i) опция в команде file, похоже, показывает кодировку файла.file -I {filename}
в Mac OS X команда
file -I(capital i) даст вам правильный набор символов, если файл, который вы тестируете, содержит символы за пределами базового диапазона ASCII.например, если вы заходите в терминал и используете vi для создания файла, например.
vi test.txtзатем вставить некоторые символы и диакритические символы (попробуйте нажать Alt-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}псевдоним где-то в моей конфигурации bash как
alias vic="vim -c 'execute \"silent !echo \" . &fileencoding | q'"поэтому я просто набираю
vic {filename}на моем vanilla 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, а затем перейти к просмотру - кодировка символов. Рядом с типом кодировки файла должен быть установлен флажок.
какой латекс вы используете? Когда я использовал 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до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
Comments