获取编码
1 | private static String getDefaultCharSet() { |
获取编码
1 | System.out.println("Default Charset=" + Charset.defaultCharset()); |
备注:
sun.jnu.encoding
是指操作系统的默认编码
file.encoding
是指文件内容编码无论JAVA文件(文本)采用什么编码,转换为class时,都会转为UTF-8编码。
文件名乱码
项目以jar启动启动正常,以服务方式启动文件名乱码
springboot服务部署在centos6上,用java -jar
启动,
1 | nohup java -Dfile.encoding=UTF-8 -jar -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128M xxx.jar >temp.txt & |
用FileWriter
创建文件时文件名正常,此时
1 | System.getProperty("sun.jnu.encoding") |
获取到的是utf-8
也就是说-Dfile.encoding=utf-8
是生效的
但是注册为系统服务时,用service方式启动,文件名乱码,
1 | System.getProperty("sun.jnu.encoding") |
服务方式获取到的编码是ANSI_X3.4-1968
尝试1 修改系统编码(无效)
查看系统编码
1 | locale |
查看系统所有编码
1 | locale -a |
修改系统编码设置
1 | vi /etc/locale.conf |
修改
LANG=en_US.UTF-8
修改为
LANG=zh_CN.UTF-8
生效
1 | source /etc/locale.conf |
但是我的系统的编码确实为UTF-8
尝试2 修改项目配置(无效)
pom.xml
已设置
1 | <build> |
但是还不行怎么办?
尝试3 修改环境设置(无效)
网上大部分都是再Tomcat的启动文件中添加了编码指定
1 | CATALINA_OPTS=-Dfile.encoding="UTF-8" |
但是我的是启动的jar的方式,没法设定
尝试4 是否跟用户有关(无效)
后来考虑的是启动的服务对应用户的字符编码的问题
查看服务对应的端口
1 | netstat -tulpn |
查看服务对应的用户、PID、内存、CPU
1 | ps aux |
但是服务启动的用户是root
尝试5 代码指定(无效)
还有网上说的直接在代码中设置
代码中直接设置编码是无效的
1 | System.setProperty("sun.jnu.encoding","UTF-8"); |
尝试6 修改Servlet容器(无效)
SpringBoot默认的Servlet容器为Tomcat
,所以尝试替换为Jetty
和Undertow
Jetty
1 | <dependency> |
Undertow
pom.xml
配置
1 | <!--移除Tomcat依赖--> |
application.properties
1 | # Undertow 日志存放目录 |
尝试7 服务指定编码(有效)
后来我想既然服务启动的 就在服务里取一下编码
1 | echo $LANG |
发现竟然是空,那我们就自己设置一个
1 | export LANG=zh_CN.UTF-8 |
整体代码如下
1 |
|