站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题大侠,如何获取一个文件使用的字符集(Charset)?

大侠,如何获取一个文件使用的字符集(Charset)?

摘要: 大侠,如何获取一个文件使用的字符集(Charset)?


如题。
InputStreamReader isr = new InputStreamReader(new FileInputStream(-#34;e://test.txt-#34;),-#34;GBK-#34;);
//System.err.println(isr.getEncoding());
BufferedReader br = new BufferedReader(isr);

比如用上面的代码显示文件内容,如果文件使用的编码是unicode,在控制台打印就是乱码,怎样才能提前获得文件的编码方式然后new一个合适的InputStreamReader呢?


如何能知道一个流的编码方式,我也想知道^_^


汗。。。是获得文件使用的字符集。。。差不多就这意思啦,高手教教俺哪


我给你一个二进制的 .ABC 文件,然后让你把里面的内容读出来,你能猜出它的格式然后正确的把数据读出来吗?应该是不能的。正常情况下,应该是我告诉你这个文件的格式,然后,你才能根据这个格式去解析这个文件。

一般而言,一个文本文件的“字符集”(严格说应该是“编码方式,encoding”)也是这个道理。谁给你的这个文本文件,他应该告诉你这个文件的编码方式。

当然也有例外。

一种例外就是符合一定规范的文件格式。比如 XML 文件,它是“自说明”的,在它的第一个文本行中就有编码方式的说明。再比如 .properties 文件,按要求它应该是 ISO-8859-1 的。

还有一种情况,就是说,你可以用程序去“猜”。不同的编码方式都会有一些特征。你把一个文件扫描一遍下来,如果它完全符合某个编码方式的特征,那么你“不妨”认为这个文件就是这种编码方式的。当然这种“猜”不能保证百分之百可靠。


我的问题是这样产生的。。。
前一阵写了一个看TXT的小工具(主要是为了偷偷看闲书),
结果从网上下的TXT有些是UNICODE的,用小工具打开就是一堆乱码,后来瞎摸索找到了方法可以正确读出GBK和UNICODE的文件了,可因为中毒源代码找不到了又忘了咋写的了。现在想彻底解决这个问题的办法。。。


maquan(-#39;ma:kju):
有些文件已经在文件内容里面告诉你它的编码了。
我就知道,文件开头2字节是FF FE的是Unicode的


-#62; 文件开头2字节是FF FE的是Unicode的

是有这种情况,但我不知道这只是“MS Windows”的习惯约定,还是有什么国际标准?

用 Notepad 可以试出来,FF FE 开头的是“unicode 文件”,FE EF 开头的是“unicode big endian 文件”,EF BB BF 开头的是“utf-8 文件”。


Sorry,说错了一点,unicode big endian 是 FE FF 开头的。


嗯,同意楼上,记得我以前用VC写过一个读取.txt文件的程序,也是看前4个16进制数据进行判断。
网上看到一位同仁用c#写的代码,功楼主参考。就是楼上所说的方法
只是简单的判断文件编码是否为:Unicode UnicodeBIG UTF-8

public class EncodingType
{
public static System.Text.Encoding GetType(string FILE_NAME)
{
FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
System.Text.Encoding r= GetType(fs);
fs.Close();
return r;
}
public static System.Text.Encoding GetType(FileStream fs)
{
byte[] Unicode=new byte[]{0xFF,0xFE};
byte[] UnicodeBIG=new byte[]{0xFE,0xFF};
byte[] UTF8=new byte[]{0xEF,0xBB,0xBF};

BinaryReader r = new BinaryReader(fs,System.Text.Encoding.Default);
byte[] ss=r.ReadBytes(3);
r.Close();
//编码类型 Coding=编码类型.ASCII;
if(ss[0]-#62;=0xEF)
{
if(ss[0]==0xEF -#38;-#38; ss[1]==0xBB -#38;-#38; ss[2]==0xBF)
{
return System.Text.Encoding.UTF8;
}
else if(ss[0]==0xFE -#38;-#38; ss[1]==0xFF)
{
return System.Text.Encoding.BigEndianUnicode;
}
else if(ss[0]==0xFF -#38;-#38; ss[1]==0xFE)
{
return System.Text.Encoding.Unicode;
}
else
{
return System.Text.Encoding.Default;
}
}
else
{
return System.Text.Encoding.Default;
}
}
}


↑返回目录
前一篇: RandomAccessFile的构造方法中的参数
后一篇: 写一个小程序,把数据库倒出来到csv中