当前页面: 开发资料首页 → 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;
}
}
}