Как определить кодировку файлов в 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, но это, кажется, не в состоянии сказать мне, что такое кодировка -- он только один раз меня понять.

849   15  

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 -I <filename>

вот и все.

используя с (например,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

    Ничего не найдено.