spring使用jdk17运行出现编码问题
遇到一个比较奇怪的问题。
这个问题别人也遇到过。
https://blog.csdn.net/gao_chuan_g/article/details/115117712
一、情况简介
使用jdk17+springboot3.x+spring6.x写一个小应用A,其中有一部分代码是用于生成SM2加密后的字符串,这个字符串会再做一些处理,最终会显示在前端的页面。
为了便于行文,把这个字符串称为regtxt。regtxt大概是这样的:
其他的应用对regtxt解密为decRegTxt,再把decRegTxt反序列化为一个java对象t。
它本身有个”用户名称“的属性,通常是中文。
在开发环境下,A生成的字符串regtxt可以正确地被其他应用解密并反序列化,中文不乱码。
但是,当A打包部署运行的时候,结果发现是乱码的。
二、问题排查
发现问题后,马上就想到:是不是编译的时候不是用utf8。当然后面证明这个想法是非常愚蠢和错误的。
重写用uf8编译打包后,还是没有解决。
于是又想:应该是jvm的运行环境不是utf8导致的,那么如何修改jvm的编码?
找了一些资料,依稀想起有个-D的参数可以控制,又搜了下,确认了:-Dfile.encoding=UTF8
于是修改启动命令为: java -Dfile.encoding=UTF8 -jar reg.jar,结果是对的。
现在回过头来,可以分析出为什么是乱码了:
1.在应用A中由于是gbk编码,那么加密后自然就是gbk的加密结果
2.加密后的字符串(含GBK的加密结果)在UTF8环境下被还原,自然无法显示GBK编码,所以乱码了。
还有没有其它的解决方法了?使用代码强制转为utf8输出?这个也是可行的!不过这个需要修改sm2工具的方法,或者解密后再转为UTF8即可。
三、总结
1.基础知识还是不够牢靠,居然会怀疑java代码的编码问题
2.在jvm内部影响编码的主要方式:根据环境变量或者强制编码的方式来控制。当然其它方式也是可以控制的。