博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解析文件入库乱码问题解决
阅读量:2061 次
发布时间:2019-04-29

本文共 1846 字,大约阅读时间需要 6 分钟。

解析文件乱码入库乱码

在解析文件和入库中我们会遇到很多乱码问题。

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

网上找了几个答案,

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"); } } }

总结:

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

转载地址:http://hzmlf.baihongyu.com/

你可能感兴趣的文章
Leetcode C++ 《第175场周赛-1 》5332.检查整数及其两倍数是否存在
查看>>
Leetcode C++ 《第175场周赛-2 》5333.制造字母异位词的最小步骤数
查看>>
Leetcode C++ 《第175场周赛-3》1348. 推文计数
查看>>
Leetcode C++《热题 Hot 100-44》102.二叉树的层次遍历
查看>>
Leetcode C++《热题 Hot 100-45》338.比特位计数
查看>>
读书摘要系列之《kubernetes权威指南·第四版》第一章:kubernetes入门
查看>>
Leetcode C++《热题 Hot 100-46》739.每日温度
查看>>
Leetcode C++《热题 Hot 100-47》236.二叉树的最近公共祖先
查看>>
Leetcode C++《热题 Hot 100-48》406.根据身高重建队列
查看>>
《kubernetes权威指南·第四版》第二章:kubernetes安装配置指南
查看>>
Leetcode C++《热题 Hot 100-49》399.除法求值
查看>>
Leetcode C++《热题 Hot 100-51》152. 乘积最大子序列
查看>>
[Kick Start 2020] Round A 1.Allocation
查看>>
Leetcode C++ 《第181场周赛-1》 5364. 按既定顺序创建目标数组
查看>>
Leetcode C++ 《第181场周赛-2》 1390. 四因数
查看>>
阿里云《云原生》公开课笔记 第一章 云原生启蒙
查看>>
阿里云《云原生》公开课笔记 第二章 容器基本概念
查看>>
阿里云《云原生》公开课笔记 第三章 kubernetes核心概念
查看>>
阿里云《云原生》公开课笔记 第四章 理解Pod和容器设计模式
查看>>
阿里云《云原生》公开课笔记 第五章 应用编排与管理
查看>>