怎样获得txt文件的字符集?
我想实现这样的功能,通过socket接收下来一个stream,存成txt文本,
以上的过程是模拟手机接收文本信息的过程。由于手机只能阅读utf8字符集的文本,所以我想判断一下这个stream或者是已经储存的这个文本字符集是否是utf8的。如何实现?
我尝试了以下方法:
public static boolean isCharSet(File file)
{
//读取文件
int readLenght=100;
byte[] hb=new byte[readLenght];
FileInputStream fos;
ByteBuffer bytebuffer=ByteBuffer.allocate(readLenght);
try {
fos = new FileInputStream(file);
int readint;
do{
readint=fos.read(hb);
bytebuffer.put(hb);
if(readint==readLenght){
bytebuffer=ByteBuffer.allocate(bytebuffer.limit()+readLenght);
}
}while(readint==readLenght);
} catch (
FileNotFoundException e) {
e.printStackTrace();
return false;
} catch (
IOException e) {
e.printStackTrace();
return false;
}
//对字符集的判断,主要看这里
Charset decodeCharset = Charset.forName( "UTF-8 ");
CharsetDecoder decoder = decodeCharset.newDecoder();
CharBuffer cb = null;
try
{
cb = decoder.decode(bytebuffer);
System.out.println( "yes ");
return true;
}
catch (CharacterCodingException ex)
{
System.out.println( "no ");
return false;
}
}
可是对任何的字符集的txt文件都返回yes,请高人指点。
------解决方案--------------------好像可以看前面几个字节,在 WinHex 下 UTF-8 格式文件前面的三个字节为:0xEF 0xBB 0xBF,可以据此来判断,没有实际用过,可以试试看。不过用 DataOutputStream.writeUTF 写进去的就不是这三个字节!!!
------解决方案--------------------好像读取文本文件,读取文件的开头两个字符如果是0xEFBB表示文件编码格式是“utf-8”,0xFFFE表示文件编码格式是“unicode”,0xFEFF表示文件编码格式是“unicodeBig”,其他的话是ASCII。
搂主可以试试。
------解决方案--------------------个人观点:
windows 记事本加入 FEBB 等,只是记事本的一个设计上的约定,是TXT的格式规范,与UFT-8无关。
而从IO流里是没法区分编码的,因为流里都是0101交替,无法判断具体涵义。如果要区分出来,必须要在流两边定一个协议,是用HTTP,还是FTP,还是TXT格式协议,而对于每一种协议,都会有一个或几个字段来区分编码的。
因此,楼主应该研究一下,这个手机是使用的哪种协议,看这种协议是使用默认编码,还是指定编码~
------解决方案--------------------可不可以先读出来再修改为统一的编码?