Java 如何在 Spring boot 中设置 UTF-8 字符编码?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/39163590/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 20:55:21  来源:igfitidea点击:

How to set UTF-8 character encoding in Spring boot?

javaspring-bootcentos7spring-java-config

提问by Laurence

I use spring-boot in my project, and I run this jar file which is built by spring-boot as a service on Centos. When I run this service:

我在我的项目中使用 spring-boot,我运行这个由 spring-boot 构建的 jar 文件作为 Centos 上的服务。当我运行此服务时:

service myApp start

服务 myApp 启动

I always get the below error messages:

我总是收到以下错误消息:

2016-08-26 09:11:02.002 ERROR 31900 --- [           main] o.s.b.c.FileEncodingApplicationListener  : System property 'file.encoding' is currently 'ANSI_X3.4-1968'. It should be 'UTF-8' (as defined in 'spring.mandatoryFileEncoding').
2016-08-26 09:11:02.018 ERROR 31900 --- [           main] o.s.b.c.FileEncodingApplicationListener  : Environment variable LANG is 'null'. You could use a locale setting that matches encoding='UTF-8'.
2016-08-26 09:11:02.018 ERROR 31900 --- [           main] o.s.b.c.FileEncodingApplicationListener  : Environment variable LC_ALL is 'null'. You could use a locale setting that matches encoding='UTF-8'.
2016-08-26 09:11:02.031 ERROR 31900 --- [           main] o.s.boot.SpringApplication               : Application startup failed
java.lang.IllegalStateException: The Java Virtual Machine has not been configured to use the desired default character encoding (UTF-8).
    at org.springframework.boot.context.FileEncodingApplicationListener.onApplicationEvent(FileEncodingApplicationListener.java:74) ~[spring-boot-1.3.7.RELEASE.jar!/:1.3.7.RELEASE]

If I run this jar file directly, then this application runs properly.

如果我直接运行这个 jar 文件,那么这个应用程序运行正常。

java -jar target/myApp-1.0.jar

java -jar 目标/myApp-1.0.jar

 .   ____          _            __ _ _
 /\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.3.7.RELEASE)

......

2016-08-26 09:54:34.954 DEBUG 32035 --- [           main] o.s.w.s.resource.ResourceUrlProvider     : Found resource handler mapping: URL pattern="/**", locations=[ServletContext resource [/], class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@1817d444]
2016-08-26 09:54:35.051  INFO 32035 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8000 (http)
2016-08-26 09:54:35.053 DEBUG 32035 --- [           main] o.s.w.c.s.StandardServletEnvironment     : Adding [server.ports] PropertySource with highest search precedence
2016-08-26 09:54:35.061  INFO 32035 --- [           main] co.nz.myApplication           : Started myApplication in 12.339 seconds (JVM running for 13.183)

This is pom.xml:

这是 pom.xml:

<project>
....

 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.7.RELEASE</version>
    <relativePath/>
 </parent>

 <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
 </properties>
 ....

 <build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <executable>true</executable>
                <jvmArguments>-Dfile.encoding=UTF8 -Dspring.profiles.active="production"</jvmArguments>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>springloaded</artifactId>
                    <version>1.2.5.RELEASE</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
 </build>
</project>

application.properties:

应用程序属性:

....
spring.mandatory-file-encoding=UTF-8
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
....

locale setting on Centos:

Centos 上的语言环境设置:

$ locale

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8

I check all files setting as possible as I do, however I still have no idea how to solve this problem. I would appreciate if you can give me any suggestion.

我尽可能检查所有文件设置,但是我仍然不知道如何解决这个问题。如果您能给我任何建议,我将不胜感激。

回答by Dominik Koszkul

The first line tells you that you should set system property 'file.encoding'. I think that's the problem. Please see: Setting the default Java character encoding?

第一行告诉您应该设置系统属性“file.encoding”。我认为这就是问题所在。请参阅:设置默认 Java 字符编码?

回答by Laurence

Finally I found a way so that I can launch Spring-boot project properly.

最后我找到了一种方法,以便我可以正确启动 Spring-boot 项目。

The solution is use sudo /etc/init.d/myApp startinstead of service myApp start

解决方案是使用sudo /etc/init.d/myApp start而不是service myApp start

回答by Krzysztof Szewczyk

SOLUTION

解决方案

Add to config file (for application /var/app/app.jarit will be /var/app/app.conf) below line:

添加到配置文件(对于应用程序/var/app/app.jar,它将是/var/app/app.conf)以下行:

export LANG='en_US.UTF-8'


CAUSE

原因

The problem is in linux systemd(service). I tested it with script /etc/init.d/test:

问题出在 linux systemd( service) 中。我用脚本测试了它/etc/init.d/test

#/bin/bash
locale

result of command $ /etc/init.d/test:

命令的结果$ /etc/init.d/test

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

and result of command $ service test:

和命令的结果$ service test

LANG=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

In spring boot jar file is build-in systemd script and before running spring boot is executed among others:

在 spring boot jar 文件中是内置的 systemd 脚本,并且在运行 spring boot 之前执行以下操作:

# Source any config file
configfile="$(basename "${jarfile%.*}.conf")"

# Initialize CONF_FOLDER location defaulting to jarfolder
[[ -z "$CONF_FOLDER" ]] && CONF_FOLDER="${jarfolder}"

# shellcheck source=/dev/null
[[ -r "${CONF_FOLDER}/${configfile}" ]] && source "${CONF_FOLDER}/${configfile}"

回答by Michail Michailidis

Based on my answer here: https://stackoverflow.com/a/48952844/986160you need to run:

根据我在这里的回答:https: //stackoverflow.com/a/48952844/986160你需要运行:

mvn spring-boot:run -Drun.jvmArguments="-Dfile.encoding=UTF-8"