电脑每次保存TXT文件的时候就会跳出窗口 自动按确定这个窗口!点确定或者取消然后就都是问号

电脑教程子分类&Java读取UTF-8的txt文件第一行出现乱码&?&及解决
test.txt文件内容:A中2国3456
test.txt文件采用写字板保存为UTF-8格式保存并关闭后使用写字板再次打开该UTF-8文档,中文、字母正常显示
测试代码:
import&java.io.BufferedR&&
import&java.io.F&&
import&java.io.FileInputS&&
import&java.io.InputStreamR&&
public&class&ReadTxtFile&{&&
&&&&public&static&void&main(String[]&args)&{&&
&&&&&&&&try&{&&
&&&&&&&&&&&&String&charsetName&=&"UTF-8";&&&
&&&&&&&&&&&&String&path&=&"D:/to_delete/test.txt";&&
&&&&&&&&&&&&File&file&=&new&File(path);&&
&&&&&&&&&&&&if&(file.isFile()&&&&file.exists())&&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&InputStreamReader&insReader&=&new&InputStreamReader(&&
&&&&&&&&&&&&&&&&&&&&&&&&new&FileInputStream(file),&charsetName);&&
&&&&&&&&&&&&&&&&BufferedReader&bufReader&=&new&BufferedReader(insReader);&&
&&&&&&&&&&&&&&&&String&line&=&new&String();&&
&&&&&&&&&&&&&&&&while&((line&=&bufReader.readLine())&!=&null)&{&&
&&&&&&&&&&&&&&&&&&&&System.out.println(line);&&
&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&bufReader.close();&&
&&&&&&&&&&&&&&&&insReader.close();&&
&&&&&&&&&&&&}&&
&&&&&&&&}&catch&(Exception&e)&{&&
&&&&&&&&&&&&System.out.println("读取文件内容操作出错");&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&&
程序执行结果:?A中2国3456
我的解决办法:
使用UltraEdit将上边的txt文件另存为UTF-8无BOM格式;
使用Notepad++打开上边的txt文件执行如下操作&格式--&以UTF-8无BOM格式编码&,修改后将txt文本进行保存。
网上有篇非常好的文章,论述了问题出现的原因及解决办法
关键字: java 读utf-8, java写utf-8, 编码, utf-8 乱码
最近在处理文件时发现了同样类型的文件使用的编码可能是不同的。所以想将文件的格式统一一下(因为UTF-8的通用性,决定往UTF-8统一),遇见的第一个问题是:如何查看现有文件的编码方式。&上网找了一下,找到几篇比较好文章,这里就不转载啦把链接搞过来。&&&&&上面的几篇文章可以看成认识编码问题的&从入门到精通&&如果你看完了上面的文章,一定了解到了,在java中,class文件采用utf8的编码方式,JVM运行时采用utf16。Java的字符串是永远都是unicode的,采用的是UTF-16的编码方式。&想测试一下,java对UTF-8文件的读写的能力,结果发现了一个很郁闷的问题,如果通过java写的UTF-8文件,使用Java可以正确的读,但是如果用记事本将相同的内容使用UTF-8格式保存,则在使用程序读取是会从文件中多读出一个不可见字符。&测试代码如下:&
import&java.io.BufferedR &&
import&java.io.F &&
import&java.io.FileInputS &&
import&java.io.IOE &&
import&java.io.InputStreamR &&
public&class&UTF8Test&{ &&
&&&&public&static&void&main(String[]&args)&throws&IOException&{ &&
&&&&&&&&File&f&&=&new&File("./utf.txt"); &&
&&&&&&&&FileInputStream&in&=&new&FileInputStream(f); &&
&&&&&&&&&&
&&&&&&&&BufferedReader&br&=&new&BufferedReader(new&InputStreamReader(in,&"UTF-8")); &&
&&&&&&&& &&
&&&&&&&&String&line&=&br.readLine(); &&
&&&&&&&&while(line&!=&null) &&
&&&&&&&&{ &&
&&&&&&&&&&&&System.out.println(line); &&
&&&&&&&&&&&&line&=&br.readLine(); &&
&&&&&&&&} &&
import&java.io.BufferedR&&
import&java.io.F&&
import&java.io.FileInputS&&
import&java.io.IOE&&
import&java.io.InputStreamR&&
public&class&UTF8Test&{&&
&&&&public&static&void&main(String[]&args)&throws&IOException&{&&
&&&&&&&&File&f&&=&new&File("./utf.txt");&&
&&&&&&&&FileInputStream&in&=&new&FileInputStream(f);&&
&&&&&&&&&&
&&&&&&&&BufferedReader&br&=&new&BufferedReader(new&InputStreamReader(in,&"UTF-8"));&&
&&&&&&&&&&
&&&&&&&&String&line&=&br.readLine();&&
&&&&&&&&while(line&!=&null)&&
&&&&&&&&{&&
&&&&&&&&&&&&System.out.println(line);&&
&&&&&&&&&&&&line&=&br.readLine();&&
&&&&&&&&}&&
utf.txt通过记事本创建,另存时使用指定utf-8编码,其内容为:&
This is the first line.&This is second line.&
正常的测试结果应该是直接输出utf.txt的文本内容。可是实际上却输出了下面的内容:&
?This is the first line.&This is second line.&
第一行多出了一个问号。&通过上面的几篇文章应该可以想到是Java读取BOM(Byte Order Mark)的问题,在使用UTF-8时,可以在文件的开始使用3个字节的"EF BB BF"来标识文件使用了UTF-8的编码,当然也可以不用这个3个字节。&上面的问题应该就是因为对开头3个字节的读取导致的。开始不太相信这个是JDK的Bug,后来在多次试验后,问题依然存在,就又狗狗了一下,果然找到一个如下的Bug:&&不过在我关掉的一些页面中记得有篇文件说这个bug只在jdk1.5及之前的版本才有,说是1.6已经解决了,从目前来看1.6只是解决了读取带有BOM文件失败的问题,还是不能区别处理有BOM和无BOM的UTF-8编码的文件,从Bug ID:4508058里的描述可以看出,这个问题将作为一个不会修改的问题关闭,对于BOM编码的识别将由应用程序自己来处理,原因可从另处一个bug处查看到,因为Unicode对于BOM的编码的规定可能发生变化。也就是说对于一个UTF-8的文件,应用程序需要知道这个文件有没有写BOM,然后自己决定处理BOM的方式。&在上面的while循环中可加入下面的代码,测试一下读出内容:&
byte[]&allbytes&=&line.getBytes("UTF-8");& &&
&&&&&&&&&&&&for&(int&i=0;&i&&&allbytes.&i++) &&
&&&&&&&&&&&&{ &&
&&&&&&&&&&&&&&&&int&tmp&=&allbytes[i]; &&
&&&&&&&&&&&&&&&&String&hexString&=&Integer.toHexString(tmp); &&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&hexString&=&hexString.substring(hexString.length()&-2); &&
&&&&&&&&&&&&&&&&System.out.print(hexString.toUpperCase()); &&
&&&&&&&&&&&&&&&&System.out.print("&"); &&
&&&&&&&&&&&&}&&
byte[]&allbytes&=&line.getBytes("UTF-8");&&&
&&&&&&&&&&&&for&(int&i=0;&i&&&allbytes.&i++)&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&int&tmp&=&allbytes[i];&&
&&&&&&&&&&&&&&&&String&hexString&=&Integer.toHexString(tmp);&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&hexString&=&hexString.substring(hexString.length()&-2);&&
&&&&&&&&&&&&&&&&System.out.print(hexString.toUpperCase());&&
&&&&&&&&&&&&&&&&System.out.print("&");&&
&&&&&&&&&&&&}&&
输出结果如下:&
EF BB BF&54 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6C 69 6E 65 2E&?This is the first line.&54 68 69 73 20 69 73 20 73 65 63 6F 6E 64 20 6C 69 6E 65 2E&This is second line.&
红色部分的"EF BB BF"刚好是UTF-8文件的BOM编码,可以看出Java在读文件时没能正确处理UTF-8文件的BOM编码,将前3个字节当作文本内容来处理了。&使用链接中提供的代码可以解决碰到的乱码问题:&&
阅读(...) 评论()

我要回帖

更多关于 每次开qq宠物就跳出来 的文章

 

随机推荐