如何检测文件是gb2312编码还是utf8编码的?

如何检测文件是gb2312编码还是utf8编码的?

如何检测文件是gb2312编码还是utf8编码的?
如何检测文件是gb2312编码还是utf8编码的?请高人指教!!
或者没有100%的准确性的方.
或者没有100%的准确性的方法,但是有个85%的准确性的方法,你要不要?
像你这样的情况,
我的方法能确定一个文件是否为UTF8编码的,反之则可以判断为GB2312编码.
兄弟请指教....
指教不敢当呀.但是先说在前头哈.这个方法是我根据最近的那个文章的讨论而得出来的.对你的这种情况可能有点儿适合.你先试用试用.如果发现有不对的地方,记得通知我一下.因为我也不敢完全肯定这个方法全对.
另外,就是我只是判断而已.不提供其它操作的了.
下面的代码我用在win xp/2000下测试过.测试的文件内容有GBK编码的,BIG5编码的.还有简体中文下的UTF-8编码和繁体中文下的UTF-8编码的.

[quote]
#!/usr/bin/perl

use Encode qw(from_to);
use strict;

$| = 1;

print (&check_is_utf8(shift) ? 'yes' : 'no');

sub check_is_utf8{
my $file = shift or return;
my $content = "";

open F, $file or return;
while (<F>){
$content .= $_;
}
close F;

my $new_con = $content;
my $orig_len = length($new_con);
from_to($new_con, "utf8", "utf8");
my $new_len = length($new_con);

if ($orig_len == $new_len){
my ($utf_str, $big5_str);
#write to tmp file and double check
from_to($content, "utf8", "gbk");
open F, ">$file.bak";
print F $content;
close F;
open F, "<:encoding(utf8)", $file;
while (<F>){
$utf_str .= $_;
}
close F;
open F, "<:encoding(gbk)", "$file.bak";
while (<F>){
$big5_str .= $_;
}
close F;
if (length($utf_str) != length($big5_str)){
unlink "$file.bak";
return 0;
}
my $start = ((substr($big5_str, 0, 1) eq '?') ? 1 : 0);
for ($start .. (length $utf_str) - 1){
#print STDERR ord(substr($utf_str, $_, 1)), " <--> ", ord(substr($big5_str, $_, 1)), "\n";
if (ord(substr($utf_str, $_, 1)) != ord(substr($big5_str, $_, 1))){
unlink "$file.bak";
return 0;
}
}
unlink "$file.bak";
return 1;
}else{
return 0;
}
}
[/quote]