我有我与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编码。
好吧,首先,请注意,ASCII是UTF-8的一个子集,因此,如果您的文件仅包含ASCII字符,这是正确的说,它在ASCII的已编码,它是正确的说,它是在UTF-8编码。
话虽这么说, file
通常只检查在文件的开头一小段,以确定其类型,因此,如果有非ASCII字符,但它们超出了该文件的起始段它可能会宣布它US-ASCII。 在另一方面,gedit中可能会说,该文件是UTF-8,即使它是ASCII因为UTF-8的gedit首选的字符编码,并打算将文件保存为UTF-8,如果你要过程中添加任何非ASCII字符编辑会话。 再次,如果这就是Gedit是说,它不会是错的。
现在,你的问题:
运行此命令:
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错的典型文本属性。
$ file --mime my.txt
my.txt: text/plain; charset=iso-8859-1
基于@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"
}