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

eca*_*ntu 35 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编码的.

Gre*_*Lei 63

$ file --mime my.txt 
my.txt: text/plain; charset=iso-8859-1
Run Code Online (Sandbox Code Playgroud)

  • 我发现重要的是要注意,就像@Celada已经提到的那样,`file`不能*授予*它的检测是100%正确的. (6认同)

Cel*_*ada 49

好吧,首先,请注意,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
    
    Run Code Online (Sandbox Code Playgroud)

    如果输出显示"0",则该文件仅包含ASCII字符.它是ASCII(它也是有效的UTF-8)故事的结尾.

  2. 运行此命令

    iconv -f utf-8 -t ucs-4 < your-file >/dev/null
    
    Run Code Online (Sandbox Code Playgroud)

    如果出现错误,则该文件不包含有效的UTF-8(或至少部分文件已损坏).

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


Art*_*nig 28

(在Linux上)

$ chardet <filename>
Run Code Online (Sandbox Code Playgroud)

它还提供输出的置信水平[0-1].