Как определить кодировку файла в OS X?

Я пытаюсь ввести некоторые символы UTF-8 в файл LaTeX в TextMate (который говорит, что по умолчанию используется кодировка UTF-8), но LaTeX, похоже, их не понимает.

Запуск cat my_file.tex показывает символы правильно в Терминале. Запуск ls -al показывает то, чего я никогда раньше не видел: "@" в списке файлов:

[email protected]  1 me      users      2021 Feb 11 18:05 my_file.tex

(И да, я использую \usepackage[utf8]{inputenc} в LaTeX.)

Я нашел iconv, но, похоже, он не может сказать мне, что такое кодировка - он будет преобразован только после того, как я это выясню.

Ответ 1

Значение @ означает, что файл имеет расширенные атрибуты файла, связанные с ним. Вы можете запросить их с помощью функции getxattr().

Нет никакого определенного способа обнаружить кодировку файла. Прочтите этот ответ, это объясняет, почему.

Там инструмент командной строки, enca, который пытается угадать кодировку. Вы можете проверить это.

Ответ 2

Использование опции -I (что для капитала i) в команде файла показывает кодировку файла.

file -I {filename}

Ответ 3

В Mac OS X команда file -I (столица i) даст вам правильный набор символов, пока файл, который вы тестируете, содержит символы за пределами основного диапазона ASCII.

Например, если вы заходите в Terminal и используете vi для создания файла, например. vi test.txt затем вставьте некоторые символы и включите акцентированный символ (попробуйте ALT-e, а затем e) затем сохраните файл.

Они печатают file -I text.txt, и вы должны получить такой результат:

test.txt: text/plain; charset=utf-8

Ответ 4

Вы также можете преобразовать из одного типа файла в другой, используя следующую команду:

iconv -f original_charset -t new_charset originalfile > newfile

например.

iconv -f utf-16le -t utf-8 file1.txt > file2.txt

Ответ 5

vim -c 'execute "silent !echo " . &fileencoding | q' {filename}

aliased где-то в моей конфигурации bash как

alias vic="vim -c 'execute \"silent !echo \" . &fileencoding | q'"

поэтому я просто набираю

vic {filename}

На моем ванильном OSX Yosemite он дает более точные результаты, чем "файл -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

Ответ 6

Просто используйте:

file -I <filename>

Что это.

Ответ 7

Использование команды file с опцией --mime-encoding (например, file --mime-encoding some_file.txt) вместо опции -I работает в OS X и имеет дополнительное преимущество, исключая тип mime, "text/plain", который вы, вероятно, не волнует.

Ответ 8

Классический 8-разрядный LaTeX очень ограничен, в котором могут использоваться символы UTF8; он сильно зависит от кодировки используемого шрифта и каких глифов этот шрифт доступен.

Поскольку вы не приводите конкретный пример, трудно точно знать, где проблема: пытаетесь ли вы использовать глиф, который у вашего шрифта отсутствует или вы не используете правильную кодировку шрифта в первую очередь.

Вот минимальный пример, показывающий, как несколько символов UTF8 могут использоваться в документе LaTeX:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[utf8]{inputenc}
\begin{document}
‘Héllø—thêrè.’
\end{document}

У вас может быть больше удачи в кодировке [utf8x], но нужно немного предупредить, что она больше не поддерживается и имеет некоторые особенности по сравнению с [utf8] (насколько я помню, прошло некоторое время с тех пор, как я посмотрел Это). Но если это трюк, это все, что для тебя важно.

Ответ 9

Знак @означает, что файл имеет расширенные атрибуты. xattr file показывает, какие атрибуты он имеет, xattr -l file также показывает значения атрибутов (которые иногда могут быть большими; например, xattr /System/Library/Fonts/HelveLTMM, чтобы увидеть шрифт старого стиля, который существует в ресурсе fork).

Ответ 10

Ввод file myfile.tex в терминале может иногда указывать кодировку и тип файла, используя серию алгоритмов и магических чисел. Это довольно полезно, но не полагайтесь на него, предоставляя конкретную или надежную информацию.

Файл A Localizable.strings (найденный в локализованных приложениях Mac OS X) обычно считается исходным файлом UTF-16 C.

Ответ 11

Synalyze It! позволяет сравнивать текст или байты во всех кодировках Библиотека ICU. Используя эту функцию, вы обычно видите, какая кодовая страница имеет смысл для ваших данных.

Ответ 12

Вы можете попробовать загрузить файл в окно firefox, затем перейти в View - Character Encoding. Должна быть отметка рядом с типом кодировки файла.

Ответ 13

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

Ответ 14

Скорее всего, чтобы проверить кодировку, просто проверить файл в шестнадцатеричном редакторе или аналогичном. (или написать программу для проверки). Посмотрите на двоичные данные в файле. Формат UTF-8 довольно легко распознать. Все символы ASCII являются одиночными байтами со значениями ниже 128 (0x80) Многобайтовые последовательности следуют шаблону, показанному в статье wiki

Если вы можете найти более простой способ получить программу для проверки кодировки для вас, это, очевидно, ярлык, но если все остальное не удастся, это может сделать трюк.

Ответ 15

Я ленив. Я просто использую возвышенный текст для переключения кодировок.

Ответ 16

Я реализовал bash script ниже, он работает для меня.

Сначала он пытается iconv из кодировки, возвращаемой file --mime-encoding в utf-8.

Если это не удается, оно проходит через все кодировки и показывает разницу между исходным и повторно кодированным файлом. Он пропускает кодировки, которые создают большой diff-выход ( "большой", как определено переменной MAX_DIFF_LINES или вторым входным аргументом), поскольку это скорее всего неправильная кодировка.

Если "плохие вещи" произойдут в результате использования этого script, не обвиняйте меня. Там есть rm -f, поэтому есть монстры. Я пытался предотвратить неблагоприятные эффекты, используя его в файлах со случайным суффиксом, но я не делаю никаких promises.

Протестировано на Дарвине 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