项目场景:
基于Template Mothod模式设计一个学生体检分析程序,其主要需求如下:(1)学生的体检数据包括:肺活量、视力、体重、身高等;
(2)数据存储的形式有若干种,例如数据库、json格式文件等等;
(3)程序能够读取多种来源的体检数据并对数据进行分析统计,例如求算平均体重
与身高、评价学生体质健康情况等等。
其中记录关于解决控制台乱码的奇葩错误,以及从json文件中读取信息,存放入数据链表中,关于编码的错误。
问题描述
首先是控制台的乱码问题:它是下面这样
这样:
还有这样
@Override
public void run() {
bytes = mmInStream.read(buffer);
mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();
}
原因分析与解决方案:
关于这种大面积的错误,我们首先想到的是编码错误,于是我在网上查找多方的博客以及经验贴,再在自己的摸索下逐一将问题慢慢解决。
关于控制台乱码问题:很多网上的都是改编码,也就是在文件->设置->文件编码里修改编码格式,但是这个也需要自己去摸索,统一所有utf-8编码并不适用所有情况,另外也有打开 Run --> Edit Configurations --> 选择文件
在 VM options 中加上 -Dfile.encoding=UTF-8(同样没有解决我的问题)
还有更换jdk版本(我尝试了一下感觉不是很容易,产生了很多其他错误,不过自己也可以尝试一下)
控制台乱码问题真的很令人头大,简单的乱码问题通过更改文件编码,在自己摸索下应该问题不大,不过更改后是选择中间的convert转换不是重新加载,然后重启一下(也可以不重启)差不多可以解决问题
像我这里
这是全改为utf-8的编码打印出的结果,将项目编码改为gbk后
打印结果正常了。不过有点小问题,这个小问题是出在导入json数据所导致的乱码问题。
看一下代码:
try {
String jsonString = new String(Files.readAllBytes(jsonFile.toPath()));
JSONArray jsonArray = new JSONArray(jsonString);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObj = jsonArray.getJSONObject(i);
Student student=new Student();
//主要就是name的问题
student.setName(new String(jsonObj.getString("name").getBytes("gbk"),"utf-8"));
student.setWeight(jsonObj.getDouble("weight"));
student.setHeight(jsonObj.getDouble("height"));
student.setVision(jsonObj.getDouble("vision"));
student.setLungCapacity(jsonObj.getDouble("lungCapacity"));
students.add(student);
}
想不明白为啥最后一个字是??,其他字就能解析出来呢?我将json中的数据稍微改了改,
没想到打印出来的结果
果不其然,有三个字符以上,最后那个字符都解析成了??,百思不得奇解,毕竟也没学过关于json的数据导入,当我抱着死马当活马医,网上到处查资料时,发现:
String jsonString = new String(Files.readAllBytes(jsonFile.toPath()),StandardCharsets.UTF_8);
这样就可以正常打印了:
关于具体原因放在这里:(咱也一知半解)
如果使用 new String(jsonObj.getString(“name”).getBytes(“gbk”), “utf-8”) 转化后仍然出现了乱码或不正确的字符,这可能是因为数据本身出现了编码问题,或者是因为读取数据时的编码方式不正确导致了数据的解析错误。(这里我也尝试了new String(jsonObj.getString(“name”).getBytes(“utf-8”), “utf-8”) 统一前后也是不行的,然后数据本身我觉得并没有多大的问题,读取数据时的编码方式不正确这说的有点抽象了我还是不太明白)
总之问题还是解决了,供大家参考与学习,如有大佬能指出问题所在,不胜感激。