我怎样才能确定文件编码?

时间:2012-06-13 16:06:49

标签: utf-8 character-encoding file-encodings

我有一个用VIM创建的PHP文件,但我不确定它的编码是什么。

当我使用终端并使用命令file -bi foo(我的操作系统是Ubuntu 11.04)检查编码时,它给出了下一个结果:

text/html; charset=us-ascii

但是,当我用gedit打开文件时,它说它的编码是UTF-8。

哪一个是正确的?我希望文件以UTF-8编码。

我的猜测是文件中没有BOM并且命令file -bi读取文件并且没有找到任何UTF-8字符,所以它假设它是ascii,但实际上它是用UTF编码的-8。

4 个答案:

答案 0 :(得分:60)

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

答案 1 :(得分:47)

首先,请注意ASCII是UTF-8的一个子集,所以如果你的文件只包含ASCII字符,那么说它用ASCII 编码是正确的说法是正确的。它以UTF-8编码。

话虽这么说,file通常只检查文件开头的一个短段来确定它的类型,所以如果有非ASCII字符,它可能会声明为us-ascii但它们超出了文件的初始段。另一方面,gedit可能会说该文件是UTF-8,即使它是ASCII,因为UTF-8是gedit的首选字符编码,并且如果你要添加任何非ASCII字符,它打算用UTF-8保存文件。你的编辑会话。再说一遍,如果这就是gedit所说的话,那就不错了。

现在回答你的问题:

  1. 运行此命令:

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

    如果输出显示“0”,则该文件仅包含ASCII字符。它是ASCII(并且它也是有效的UTF-8)故事结束。

  2. 运行此命令

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

    如果收到错误,该文件不包含有效的UTF-8(或至少部分文件已损坏)。

    如果没有错误,该文件很可能是UTF-8。那是因为UTF-8的属性使得很难将任何其他常用字符编码中的典型文本误认为是有效的UTF-8。

答案 2 :(得分:24)

(在Linux上)

$ chardet <filename>

它还提供输出的置信度[0-1]。

答案 3 :(得分:0)

基于@Celada的答案和@Arthur Zennig,我创建了这个简单的脚本:

#/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"
}