关于InputStreamReader(in,charsetName)的一个问题

若鱼1919 2010-04-06 03:01:15
有一个1.txt,
里面的内容是:
aa
bb
cc
dd
ee
ff
文件,另存为,选择编码方式是utf-8,另存为2.txt
读取2.txt这个文件的内容的时候,多出来一个"?",不知道为什么?

public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
InputStream in=TestFile.class.getResourceAsStream("2.txt");
BufferedReader br=new BufferedReader(new InputStreamReader(in,"UTF-8"));
String line="";
while((line=br.readLine())!=null){
System.out.println(line);
}
in.close();
br.close();
}
/*输出结果是:
?aa
bb
cc
dd
ee
ff
*/
//为什么多出来一个"?"啊?非常不解!
...全文
561 3 打赏 收藏 转发到动态 举报
写回复
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wakeUpDoNottLazy 2010-04-07
  • 打赏
  • 举报
回复
这是 notepad 的问题,为了标识 notepad 中的字符编码格式为 utf-8 notepad 需要在文档内容前加几个字节进行标识。是哪几个字节我忘记了,你可以查下
纠结的程序猿 2010-04-07
  • 打赏
  • 举报
回复
对的,这是UltraEdit的问题。有的UltraEdit版本会在HEX模式中,把原文件转换成UTF-16来显示。
你可以用PilotEdit来查看原文件的HEX编码,PilotEdit显示的是实际的HEX内容不会转换。
http://topic.csdn.net/u/20100405/17/e86b8de1-3e61-4b6c-bb19-bbfe472b5a25.html
若鱼1919 2010-04-06
  • 打赏
  • 举报
回复
原来存在一个叫做Bom头的东西用来表示文件的编码类型。
Unicode的txt前两个字节是ff fe,
Unicode big endian的txt前两个字节是fe ff
UTF-8的txt前三个字节是ef bb bf
ANSI的txt是直接开始内容的。
因此,在读取的时候需要跳过这些标识字符就可以了。
我用UltraEdit打开另存好的utf的txt文件,但是前两个字节是:FF FE,
但是用代码读出来却是:ef bb bf。不知道是不是UltraEdit的问题。
InputStream in=TestFile.class.getResourceAsStream("2.txt");
in.skip(3);//跳过三个字节
BufferedReader br=new BufferedReader(new InputStreamReader(in,"UTF-8"));
这样读出来就没有错了。
也就是说要根据Bom头来判断文件的编码类型,然后选择需要跳过的字节数,就可以正确无误的读出文件的内容
相关推荐

62,569

社区成员

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