Подтвердить что ты не робот

Как я могу быть уверен в кодировке файла?

У меня есть файл PHP, который я создал с помощью VIM, но я не уверен, какова его кодировка.

Когда я использую терминал и проверяю кодировку с помощью команды file -bi foo (моей операционной системой является Ubuntu 11.04), она дает мне следующий результат:

text/html; charset=us-ascii

Но когда я открываю файл с gedit, он говорит, что его кодировка UTF-8.

Какой из них правильный? Я хочу, чтобы файл был закодирован в UTF-8.

Я предполагаю, что в файле нет спецификации и что команда file -bi читает файл и не находит символов UTF-8, поэтому предполагает, что он ascii, но на самом деле он закодирован в UTF-8.

4b9b3361

Ответ 1

Хорошо, прежде всего, обратите внимание, что ASCII является подмножеством UTF-8, поэтому, если ваш файл содержит только символы ASCII, правильно сказать, что он закодирован в ASCII, и он правильно сказал, что он закодирован в UTF-8.

При этом file обычно рассматривает только короткий сегмент в начале файла, чтобы определить его тип, поэтому он может объявить его us-ascii, если есть символы, отличные от ASCII, но они выходят за начальный сегмент файла. С другой стороны, gedit может сказать, что файл UTF-8, даже если он ASCII, потому что UTF-8 является предпочтительной кодировкой gedit, и он намерен сохранить файл с UTF-8, если вы должны были добавить любые символы, отличные от ASCII, во время ваш сеанс редактирования. Опять же, если это то, что говорит гедит, это было бы неправильно.

Теперь на ваш вопрос:

  • Запустите эту команду:

    tr -d \\000-\\177 < your-file | wc -c
    

    Если на выходе указано "0", тогда файл содержит только символы ASCII. Это в ASCII (и это также действительный UTF-8) Конец истории.

  • Запустите эту команду

    iconv -f utf-8 -t ucs-4 < your-file >/dev/null
    

    Если вы получили сообщение об ошибке, файл не содержит допустимого UTF-8 (или, по крайней мере, некоторая часть его повреждена).

    Если вы не получите ошибки, файл, скорее всего, будет UTF-8. Это связано с тем, что UTF-8 обладает свойствами, которые очень затрудняют ошибку типичного текста в любой другой широко используемой кодировке символов для действительного UTF-8.

Ответ 2

$ file --mime my.txt 
my.txt: text/plain; charset=iso-8859-1

Ответ 3

(в Linux)

$ chardet <filename>

он также обеспечивает уровень достоверности [0-1] на выходе.

Ответ 4

Основываясь на ответе @Celada и @Arthur Zennig, я создал этот простой script:

#/bin/bash

if [ "$#" -lt 1 ]
then
  echo "Usage: utf8-check filename"
  exit 1
fi

chardet $1
countchars="$(tr -d \\000-\\177 < $1 | wc -c)"
if [ $countchars -eq 0 ]
then
 echo "Ascii";
 exit 0
fi

{
  iconv -f utf-8 -t ucs-4 < $1 >/dev/null
  echo "UTF-8"
} || {
  echo "not UTF-8 or corrupted"
}