日期:2014-05-20  浏览次数:20978 次

怎样获得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格式协议,而对于每一种协议,都会有一个或几个字段来区分编码的。
因此,楼主应该研究一下,这个手机是使用的哪种协议,看这种协议是使用默认编码,还是指定编码~

------解决方案--------------------
可不可以先读出来再修改为统一的编码?