解析文件乱码入库乱码
在解析文件和入库中我们会遇到很多乱码问题。
最近做了个拉取亚马逊广告的报表的需求,出现了一个乱码问题。且这个问题在本地运行没有问题而在测试环境确出现了,中文全部变成???。
网上找了几个答案,
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");
}
}
}
总结:
遇到文件解析编码解码时一定要注意保持编码一致