44

我有一个用 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

4 回答 4

72
$ file --mime my.txt 
my.txt: text/plain; charset=iso-8859-1
于 2015-01-19T02:52:41.350 回答
57

好吧,首先,请注意 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。

于 2012-06-13T18:49:19.937 回答
30

(在 Linux 上)

$ chardet <filename>

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

于 2016-03-11T11:19:50.437 回答
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"
}
于 2016-06-18T15:19:15.170 回答