200分求解,如何知道一个文件的编码!

lzheng2001 2007-11-01 06:21:18
如何知道一个文件的编码? 请注意文件头没有任何编码信息的情况下如何知道文件的编码?

我发现用记事本打开文件,记事本能自动识别文件的编码,不知道记事是如何做到的?? 请注意,文件头绝对没有编码的信息,那些说根据文件的头两个字节来判断的方法是行不通的.
既然记事本能认出来,我想一定有方法可以知道文件的编码,希望高人指点.
...全文
881 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainv 2007-11-16
  • 打赏
  • 举报
回复
学习
CaiKanXP 2007-11-16
  • 打赏
  • 举报
回复
文本编码是个历史问题,移动和联通已经证明了这个问题将永远也无法解决……
kulin3422 2007-11-16
  • 打赏
  • 举报
回复
学习
cxz7531 2007-11-16
  • 打赏
  • 举报
回复
这个很复杂的,有一个判断编码的类,2000多行。
lzheng2001 2007-11-15
  • 打赏
  • 举报
回复
to LexChen : 或许真的没有完全的方法, 即使连windows记事本也不是完美,但能做到记事本的辨认功能已经足够,我现在要探讨的是记事本的实现原理,并不是要完美的办法.
lzheng2001 2007-11-15
  • 打赏
  • 举报
回复
to LexChen : 你得看看编码规律的资料. 一般来说有100个字节就足够了. 如果你用记事上打10个汉字以上,出现误认的机率几乎为0了. 事实上有99%能正确分辩已经足够, 总比什么都不知道强. 事实上我们的文件不会只有两个字节,只要字节数有几十个就足够了. 即使只有几个字节,命中率还是很高的.
LexChen 2007-11-14
  • 打赏
  • 举报
回复
本来好意,如果某些话刺激了楼主的某根神经,先道歉了,但最后还有一些话
是要说一下的:

1.现实往往是残酷的,你不可能永远有足够的样本空间
2.足够长的字符串与样本空间不一样,有足够长的也是不一定的,比如重复一万次的“联通”
3.“联通”不是个例,UTF-8的“汉汉”你用GB2312来解释看看你就知道了
4.如果一种文字是用一种你不知道的编码写的,恰恰你知道的一种编码又
解释的通,难道就是你知道的那种编码么?
5.编码的问题本来就没有那么简单,俺至少也在上面耗了好多年的时间了,你
能知道的方法永远是尝试的方法,不可能没有一点的错误
6.如果给我一个支点和一个足够长的杠杆,我也可以支起地球

我不会再看这篇帖子,谢谢!
anto1985 2007-11-14
  • 打赏
  • 举报
回复

public BufferedFileReader(String fileName) {
this.fileName = fileName;
byte[] head2 = new byte[2];
head2[0] = 0;
head2[1] = 0;
try {
InputStream in = new FileInputStream(fileName);
int bytes = 0;
try {
bytes = in.read(head2);

} catch (IOException ioE) {
}
if (bytes < 2) {
in.close();
bufReader = new BufferedReader(new InputStreamReader(
new FileInputStream(fileName)));
needCheckCharset = false;
} else {
try {
if (head2[0] == (byte)0xEF && head2[1] == (byte)0xBB) {
bufReader = new BufferedReader(new InputStreamReader(
in, "UTF-8"));
needCheckCharset = false;
} else if (head2[0] == (byte)0xFF && head2[1] == (byte)0xFE) {
bufReader = new BufferedReader(new InputStreamReader(
in, "UTF-16LE"));
needCheckCharset = false;
} else if (head2[0] == (byte)0xFE && head2[1] == (byte)0xFF) {
bufReader = new BufferedReader(new InputStreamReader(
in, "UTF-16BE"));
needCheckCharset = false;
} else {
in.close();
bufReader = new BufferedReader(new InputStreamReader(
new FileInputStream(fileName)));
needCheckCharset = true;
}
} catch (UnsupportedEncodingException ueE) {
ueE.printStackTrace();
}
}
} catch (FileNotFoundException fnfE) {
fnfE.printStackTrace();
} catch (IOException ioE) {
ioE.printStackTrace();
}
}
lzheng2001 2007-11-14
  • 打赏
  • 举报
回复
谢谢,Kokonol 给的信息.
lzheng2001 2007-11-13
  • 打赏
  • 举报
回复
很负责任的告诉你,如果文件不是全部都非常规范的话,没有一个完美的方法可以知道一个文件是用啥编码来写的
================================
我可以告诉你,只有有足够字节作为样本分析,是可以知道编码的. "联通"问题,只是因为字节太少,所以才会误认为utf-8编码.
ftgreat 2007-11-09
  • 打赏
  • 举报
回复
看不懂啊
Kokonol 2007-11-09
  • 打赏
  • 举报
回复
不好意思一直没来 建议楼住看一下 张孝祥JAVA视频教程高级部分
中IO流 字符编码那一部分 应该是第7讲 emule 里可以下
  • 打赏
  • 举报
回复
不清楚,帮顶下....嘎嘎
lihaifeng0412 2007-11-07
  • 打赏
  • 举报
回复
学习
宋玮-深圳 2007-11-07
  • 打赏
  • 举报
回复
没有100%的办法,同样的000101110 ,不同的编码都可以解释,只不过意思不同而已。
liuzi123 2007-11-07
  • 打赏
  • 举报
回复
关注,把文件导入到eclipse
Norris_Zhang 2007-11-07
  • 打赏
  • 举报
回复
还是第一次听说“联通”的故事,真奇妙,呵呵。
bukuai009 2007-11-07
  • 打赏
  • 举报
回复
用UltraEdit的16进制打开文件查看下
LexChen 2007-11-07
  • 打赏
  • 举报
回复
很负责任的告诉你,如果文件不是全部都非常规范的话,没有一个完美的方法可以知道一个文件是用啥编码来写的
LexChen 2007-11-07
  • 打赏
  • 举报
回复
很负责任的告诉你,如果文件不是全部都非常规范的话,没有一个完美的方法可以知道一个文件是用啥编码来写的
加载更多回复(19)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧