今天同事在保存文件时,需要保存一个“元”字,这个文件有且只有一个汉字,发生了乱码。工程是UTF-8编码,文件格式要求是GBK。
于是就多做了几种测试,发现很有意思:
- 当有且只有一个“元”字时(其他字符或是数字,或是字母,下同),肯定会发生乱码。
- 当不是“元”,而是其他汉字时(非yuan这种发音),都不会发生乱码。
- 当所有都是“元”字时,也会发生乱码。
此问题尚未搞明白!
package net.bwda.Test; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.Writer; public class StringTest { public static void main(String[] args) { String strTest1 = "元"; String strTest2 = "和"; String strTest3 = "元元元元元"; String strTest4 = "缘"; try { stringToFile(strTest1, "d:\1.txt", "GBK"); stringToFile(strTest2, "d:\2.txt", "GBK"); stringToFile(strTest3, "d:\3.txt", "GBK"); stringToFile(strTest4, "d:\4.txt", "GBK"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public final static boolean stringToFile(String strContent, String strFilePath, String strCoding) { boolean blnResult = false; FileOutputStream fileOutputStream = null; // 文件输出对象 Writer writer = null; try { fileOutputStream = new FileOutputStream(strFilePath); if (strCoding == null || strCoding.trim().length() <= 0) { writer = new OutputStreamWriter(fileOutputStream); } else { writer = new OutputStreamWriter(fileOutputStream, strCoding); } writer.write(strContent); writer.flush(); writer.close(); fileOutputStream.close(); blnResult = true; } catch (Exception e) { } finally { writer = null; fileOutputStream = null; } return blnResult; } }
----------------------------------------------------------------------------------------------------------------------------------
已经解决了。
说明:上面代码生成的文件是没有问题的,只是在用UE或editplus打开时会出现乱码,但是用写字板打开就不是。
又做了这个试验,用UE和editplus新建一个文件,就写一个“元”字,保存后,关闭后重新打开该文件,也同样显示乱码。
写字板打开该文件不会出现乱码,正常显示文字。这说明保存的文字是可以被正确读取的。
于是就又写了段读文件的代码(GBK读取),发现也可以正常显示,OK!
-----------------------------------------------------------------------------------------------------------------------------------
2016-04-13 08:56:37 今天有网友回复说“联通”二字也是乱码。经测试也是如此,但是写字板打开不是乱码。