Как определить кодировку файлов в 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 -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, а затем перейти к кодировке 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