解析文件入库乱码问题解决

解析文件乱码入库乱码

在解析文件和入库中我们会遇到很多乱码问题。
最近做了个拉取亚马逊广告的报表的需求,出现了一个乱码问题。且这个问题在本地运行没有问题而在测试环境确出现了,中文全部变成???。
在这里插入图片描述

网上找了几个答案,

1.数据库编码设置错误,需将数据库表或字段编码设置为utf8

2.由于我这个是使用mybatis,需要在数据url连接后面加上

?useUnicode=true&characterEncoding=UTF-8

第一种:数据库编码设置错误

我的数据由于使用的是clickhouse,clickhouse不区分数据编码。其实我换成mysql后也出现了同样的问题
在这里插入图片描述

数据库编码也没错,但是还是存在乱码。

第二种:加上?useUnicode=true&characterEncoding=UTF-8

在这里插入图片描述

加上?useUnicode=true&characterEncoding=UTF-8,问题还是存在。mysql数据库同样如此。

上面两种方法都尝试后,乱码问题还是存在。因此猜测可能是入库数据本身就存在问题。

编码解码不一致

解压giz文件,使用notePad++打开发现文件格式为 UTF-8

在这里插入图片描述

文件格式是UTF-8但是数据变成乱码,这个那就是编码和解码的问题了。

找到对应解压文件代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dxkICSEI-1614418439049)(C:\Users\10599\AppData\Local\YNote\data\m18702149475@163.com\31e5a4b1bb9548839c6ea24c831d936c\clipboard.png)]

发现上述代码将字节流转换成使用的默认编码,如果默认编码不是UTF-8那就出现乱码了。

获取JVM默认编码

System.getProperty(“file.encoding”)
Charset.defaultCharset()

使用java VisualVM查看 jvm编码(jvm编码和系统本地编码并是一致的)为ANSI_X3.4-1968。
在这里插入图片描述

而本地jvm默认编码为UTF-8,因此本地没有出现乱码。
在这里插入图片描述

知道是文件解析编码问题后,解析代码加入默认编码格式后,乱码得到解决。

可以在运行JVM时指定-Dfile.encoding=utf-8参数来规定编码。
在Tomcat中配置catalina文件
Linux中,在catalina.sh配置JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=utf-8"
Windows中,在catalina.bat配置set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8

代码解决
/**

- 解压gz成字符串
- @param fin 输入流
- @param charSet 输出字符编码
- @return
- @throws IOException
  */
  public static String unzipGz(FileInputStream fin,String... charSet) throws IOException {
  //建立gzip解压工作流
  try (GZIPInputStream ginzip = new GZIPInputStream(fin)) {
      byte[] buffer = new byte[1024];
      int offset;
      try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
          while ((offset = ginzip.read(buffer)) != -1) {
              out.write(buffer, 0, offset);
          }
          if(charSet!=null&&charSet.length>0){
              return out.toString(charSet[0]);
          }
          return out.toString("UTF-8");
      }
  }
  }

总结:

遇到文件解析编码解码时一定要注意保持编码一致

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值