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内部影响编码的主要方式:根据环境变量或者强制编码的方式来控制。当然其它方式也是可以控制的。

 

posted @ 2024-03-20 19:45  正在战斗中  阅读(101)  评论(0编辑  收藏  举报