1、问题背景:
接手新项目,项目框架为spring-boot+freemaker,Gradle管理
2、部署过程
观察到application.properties文件中有该设置
spring.freemaker.charset = GBK
因此认为项目编码为GBK
使用Gradle导入,没有更改任何Eclipse的编码配置
(PS:使用Intelli 导入eclipse项目 不能自动下载jar包,因此还是用eclipse比较方便)
3、问题出现:
Web页面上中文 部分正常显示,部分乱码,一般是从服务器后台传值给freeemaker html的值为乱码。chrome上的charset扩展程序显示页面编码为GBK。
查看乱码来源的.java文件发现在IDE中也显示为乱码,右键单击文件properties->Text file encoding ->取消default(GBK),选择other(UTF-8),IDE中程序文件中的中文显示恢复正常。重新Run,Web页面仍然显示乱码。
这是必然的,程序文件采用UTF-8编码,可是解析出来的前端模板采用GBK,两者不一致,肯定是乱码。
4、问题解决:
从workspace中删除项目,设置Window->Preferences->Content Types->Text->Java Source File->Default encoding 填入UTF-8,这样保证编译环节.java中的中文能正确解析
WorkSpace中的Text file encoding仍然保留为默认的GBK,这个默认GBK不会影响上一步中设置的JavaSourceFile的text file encoing 为UTF-8,还能保证freemaker生成的GBK hmtl文件能正确解析。如果这个也设置成了UTF-8,那么在单个文件的个性化text file encoding设置那里other 中会没有GBK的选项,只有UTF-8等其他非eclipse默认的编码类型。
值得注意的是,request请求仍是utf-8的
res.setHeader("content-type", "application/octet-stream;charset=UTF-8");
每个文件可以通过properties设置单独的编码格式。
5、总结
spring.freemaker.charset=GBK 设置的是页面渲染模板文件的编码类型,其实官网上都建议设置成为UTF-8,反正最好与Java Source File的text file encoding 保持一致,这样才能避免在项目导入IDE时对不同类型文件的多重编码格式设置。比如这次我因为同事之前设置了GBK和UTF-8 两种格式的原因,就要在接手项目的时候针对templates html文件 和java source file文件设置两种不同的编码格式,不设置的话,IDE采用默认的统一编码GBK在IDE中展示项目文件,.java中的中文是乱码,这样不仅开发人员看不懂,也导致Web页面乱码。如果我将项目文件都设置成UTF-8,那么只有.html文件在IDE中展示中文乱码,Web页面仍是正常的,因为freemaker的charset是GBK,生成的html是GBK,解析的时候也是GBK