怎样获得txt文件的字符集?

tangge1010 2007-08-27 12:02:58
我想实现这样的功能,通过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,请高人指点。
...全文
1305 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
tangge1010 2007-08-30
  • 打赏
  • 举报
回复
不是的,我就是要判断邮件服务器返回给我的东西是不是utf8的,不然到手机上就是乱码,我要自动测试这个东西。请大家帮帮忙。
testtestan 2007-08-30
  • 打赏
  • 举报
回复
可不可以先读出来再修改为统一的编码?
tangge1010 2007-08-30
  • 打赏
  • 举报
回复
手机上的协议是扩展的pop协议,下载txt附件的时候,会将内容以base64的方式传递过来,经过base64 Uncode后,就是文本内容,但是我要判断这个内容是不是utf8的。
大海Online 2007-08-27
  • 打赏
  • 举报
回复
个人观点:
windows 记事本加入 FEBB 等,只是记事本的一个设计上的约定,是TXT的格式规范,与UFT-8无关。
而从IO流里是没法区分编码的,因为流里都是0101交替,无法判断具体涵义。如果要区分出来,必须要在流两边定一个协议,是用HTTP,还是FTP,还是TXT格式协议,而对于每一种协议,都会有一个或几个字段来区分编码的。
因此,楼主应该研究一下,这个手机是使用的哪种协议,看这种协议是使用默认编码,还是指定编码~
tangge1010 2007-08-27
  • 打赏
  • 举报
回复
我顶。我顶!着急啊
tangge1010 2007-08-27
  • 打赏
  • 举报
回复
那怎么去判断这个InputStream是UTF8字符集呢?我在线等,谢谢各位。
  • 打赏
  • 举报
回复
对的,这个问题我也发现了,使用 DataInputStream.writeUTF 写入时,得到的文件头部就和记事本中的不一样了,而且用记事本打开前面几个字符还会是乱码!不知道有什么标准没有。
tangge1010 2007-08-27
  • 打赏
  • 举报
回复
谢谢你“bao110908(长牙了,好痛)”
确实好用,不过新的问题出现了。。。这个是针对windows下保存的记事本可以用,可是目前我是将Stream保存到txt了,保存后,点击另存为,确实看到此txt是“utf8”的,但是这种文件开头就不符合标准,看来我是不是必须要研究怎么去判断这个stream是否为utf8编码了,而不能去判断txt文件?

在帮帮我吧。谢谢大家了。分不够我可以在加。
  • 打赏
  • 举报
回复
final String FILENAME = "f:/aabbcc.txt";
InputStream is = new FileInputStream(FILENAME);
byte[] utf8head = {(byte)0xEF, (byte)0xBB, (byte)0xBF};
byte[] b = new byte[3];
is.read(b);

BufferedReader br = null;
if(Arrays.equals(utf8head, b)) {
  br = new BufferedReader(new InputStreamReader(is, "utf-8"));
}else{
  br = new BufferedReader(new FileReader(FILENAME));
}
String str = "";
while( (str = br.readLine()) != null) {
  System.out.println(str);
}
is.close();
br.close();

以上代码仅供参考。未经过严格测试,仅在 Windows 记事本保存的 UTF-8 和 ANSI 格式下测试有效。
wddlqd 2007-08-27
  • 打赏
  • 举报
回复
好像读取文本文件,读取文件的开头两个字符如果是0xEFBB表示文件编码格式是“utf-8”,0xFFFE表示文件编码格式是“unicode”,0xFEFF表示文件编码格式是“unicodeBig”,其他的话是ASCII。

搂主可以试试。
tangge1010 2007-08-27
  • 打赏
  • 举报
回复
谢谢楼上,可我还是不太明白,我不是弄的二进制文件,只是txt文本文件,而且在windows下的。
读取前三个自己就是文本内容啊?那里能找到你说的0xEF 0xBB 0xBF??
  • 打赏
  • 举报
回复
好像可以看前面几个字节,在 WinHex 下 UTF-8 格式文件前面的三个字节为:0xEF 0xBB 0xBF,可以据此来判断,没有实际用过,可以试试看。不过用 DataOutputStream.writeUTF 写进去的就不是这三个字节!!!
tangge1010 2007-08-27
  • 打赏
  • 举报
回复
没人顶么?我在加点分。

62,623

社区成员

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

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