获取编码
1 2 3 4 5
| private static String getDefaultCharSet() { OutputStreamWriter writer = new OutputStreamWriter(new ByteArrayOutputStream()); String enc = writer.getEncoding(); return enc; }
|
获取编码
1 2 3 4
| System.out.println("Default Charset=" + Charset.defaultCharset()); System.out.println("file.encoding=" + System.getProperty("file.encoding")); System.out.println("Default Charset=" + System.getProperty("sun.jnu.encoding")); System.out.println("Default Charset in Use=" + getDefaultCharSet());
|
备注:
文件名乱码
项目以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 修改系统编码(无效)
查看系统编码
查看系统所有编码
修改系统编码设置
修改
LANG=en_US.UTF-8
修改为
LANG=zh_CN.UTF-8
生效
但是我的系统的编码确实为UTF-8
尝试2 修改项目配置(无效)
pom.xml已设置
1 2 3 4 5 6 7 8 9 10 11 12
| <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>1.4.0.RELEASE</version> <configuration> <jvmArguments>-Dsun.jnu.encoding=UTF-8</jvmArguments> </configuration> </plugin> </plugins> </build>
|
但是还不行怎么办?
尝试3 修改环境设置(无效)
网上大部分都是再Tomcat的启动文件中添加了编码指定
1
| CATALINA_OPTS=-Dfile.encoding="UTF-8"
|
但是我的是启动的jar的方式,没法设定
尝试4 是否跟用户有关(无效)
后来考虑的是启动的服务对应用户的字符编码的问题
查看服务对应的端口
查看服务对应的用户、PID、内存、CPU
但是服务启动的用户是root
尝试5 代码指定(无效)
还有网上说的直接在代码中设置
代码中直接设置编码是无效的
1
| System.setProperty("sun.jnu.encoding","UTF-8");
|
尝试6 修改Servlet容器(无效)
SpringBoot默认的Servlet容器为Tomcat,所以尝试替换为Jetty和Undertow
Jetty
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <artifactId>spring-boot-starter-tomcat</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> </exclusions> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency>
|
Undertow
pom.xml配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </dependency>
|
application.properties
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| server.undertow.accesslog.dir=
server.undertow.accesslog.enabled=false
server.undertow.accesslog.pattern=common
server.undertow.accesslog.prefix=access_log
server.undertow.accesslog.suffix=log
server.undertow.max-http-post-size=0
server.undertow.io-threads=4
server.undertow.worker-threads=20
server.undertow.buffer-size=1024
server.undertow.buffers-per-region=1024
server.undertow.direct-buffers=true
|
尝试7 服务指定编码(有效)
后来我想既然服务启动的 就在服务里取一下编码
发现竟然是空,那我们就自己设置一个
整体代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #!/bin/sh
JAR_ROOT=/data/wwwroot/8895shuatiapi/
JAR_PATH="$JAR_ROOT"shuatiapi-0.0.1-SNAPSHOT.jar
LOG_PATH="$JAR_ROOT"log.txt
start() { cd $JAR_ROOT export LANG=zh_CN.UTF-8 nohup java -Dfile.encoding=utf-8 -jar -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128M $JAR_PATH >$LOG_PATH & echo "$JAR_PATH start success." }
stop() { kill -9 `ps -ef|grep $JAR_PATH|grep -v grep|grep -v stop|awk '{print $2}'` echo "$JAR_PATH stop success." }
case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) echo "Userage: $0 {start|stop|restart}" exit 1 esac
|