Как определить кодировку файла в OSX? - PullRequest
161 голосов
/ 12 февраля 2009

Я пытаюсь ввести некоторые символы 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} в LaTeX.)

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

Ответы [ 15 ]

1 голос
/ 05 марта 2014

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

1 голос
/ 18 июня 2013

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

0 голосов
/ 09 июня 2017

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

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

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

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

Проверено на Дарвине 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
0 голосов
/ 12 февраля 2009

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

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

0 голосов
/ 12 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...