我怎么能确定文件编码的?(How can I be sure of the file encodin

2019-06-25 11:03发布

我有我与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编码。

Answer 1:

好吧,首先,请注意,ASCII是UTF-8的一个子集,因此,如果您的文件仅包含ASCII字符,这是正确的说,它在ASCII的已编码它是正确的说,它是在UTF-8编码。

话虽这么说, file通常只检查在文件的开头一小段,以确定其类型,因此,如果有非ASCII字符,但它们超出了该文件的起始段它可能会宣布它US-ASCII。 在另一方面,gedit中可能会说,该文件是UTF-8,即使它是ASCII因为UTF-8的gedit首选的字符编码,并打算将文件保存为UTF-8,如果你要过程中添加任何非ASCII字符编辑会话。 再次,如果这就是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错的典型文本属性。



Answer 2:

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


Answer 3:

(在Linux上)

$ chardet <filename>

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



Answer 4:

基于@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"
}


文章来源: How can I be sure of the file encoding?