Android日常问题之BOM乱码

306 阅读2分钟

问题描述

使用DataInputStream读取指定文件的输入流,然后再使用JSONValue.parse,理论上会得到一个JSONArray,然而在我修改过txt文件的内容并保存替换原文件后,再执行就无法得到理论上的JSONArray

相关代码

 String filepath = "/sdcard/test.txt"; 
 File tFile = new File(filepath);
 byte[] tByte = new byte[(int)tFile.length()];
 DataInputStream in = new DataInputStream(new FileInputStream(filepath));
 in.readFully(tByte);
 
 String str = new String(tByte, "utf-8");
 Object strObj = JSONValue.parse(str);
 JSONArray strArr = strObj instanceof JSONArray ? (JSONArray) strObj : new JSONArray();

文件内容

[{
"userId": "10000001",
"name": "张明",
"sex": "男"
},
{
"userId": "10000002",
"name": "西瓜",
"sex": "女"}
]

尝试方法1

经过debug发现,指定文件的输入流转换成string后,带有\n和\t,所以我使用了replace方法,然而结果还是错误的

尝试方法2

卸载app,删除app工作根目录,重新跑一遍,结果还是错误

解决方法

所谓解铃还须系铃人,从哪里出错就从哪里解决,这个问题出现的原因就是我修改了txt文件内容,所以我去找到了原来没改过的源文件,再次执行,发现一点问题没有。到此,我发现,果然问题出在了txt文件中,此时,使用diffmerge工具,对比修改后的文件和之前的源文件区别,发现修改后的文件的中文都是乱码

后来搜到了一篇文章,UTF8最好不要带BOM,附许多经典评论,这篇文章中提到UTF8不要带BOM,而且BOM是微软的习惯,使用记事本编辑文本,保存后就会自动保存为带BOM的UTF8编码格式,那怎么办呢,以后再修改txt文件就不要用记事本了,使用工具软件editPlus或者notepad++,保存为不带BOM的UTF格式即可