【发布时间】:2021-12-27 07:28:30
【问题描述】:
我正在开发一个 Java 应用程序。我需要在我的 Java webapp 中获得 UTF-8 编码以支持孟加拉语 (বাংলা) 文本。我做了以下事情:
Tomcat 的 server.xml
<Connector port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" />
<Connector executor="tomcatThreadPool"
port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" />
<Connector protocol="AJP/1.3"
address="::1"
port="8009"
redirectPort="8443"
URIEncoding="UTF-8" />
catalina.bat 文件中的 JVM defaultCharset
set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8
application.properties 中的属性
spring.datasource.url=jdbc:mysql://localhost:3306/database_name?useUnicode=true\&characterEncoding=UTF-8
spring.datasource.tomcat.connection-properties=useUnicode=true;characterEncoding=UTF-8
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
server.tomcat.uri-encoding=UTF-8
spring.webflux.multipart.headers-charset=UTF-8
spring.thymeleaf.encoding=UTF-8
html 文件中的元标记
<!doctype html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<head>
<meta charset="utf-8">
</head>
<body>
</body>
</html>
表单标签支持utf-8
<form enctype="multipart/form-data" accept-charset="UTF-8" action="#" th:action="@{/create}" th:object="${object}" th:method="POST">
<div class="form-group">
<label for="name" class="col-form-label">Name</label>
<input type="text" class="form-control" id="name" name="name" th:field="*{name}" placeholder="Enter Name">
</div>
<div class="form-group">
<label for="photo">Photo</label>
<input type="file" class="form-control-file" id="photo" name="photo"/>
</div>
<div>
<button class="btn" type="submit">Submit</button>
</div>
</form>
MySQL 配置 (my.ini)
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
MySQL 属性:
Database:
Default collation: utf8mb4_0900_ai_ci
Default charactterset: utf8mb4
Table:
Table collation: utf8mb4_0900_ai_ci
Column:
Type: varchar(255)
Character Set: utf8mb4
Collation: utf8mb4_0900_ai_ci
配置:
- Java 11.0.2
- Tomcat 8.5
- MySQL 8.0.16
- Spring Boot 2.2.4
- Maven 3.8.1
- Windows Server 2019 标准版(生产版)+ Windows 10 家庭版(开发版)
当我提交一个值为আনোয়ার的表单时,它被保存为আনোয়ার
我该如何解决这个问题?
当我从 Eclipse 运行应用程序时,它工作正常。但是当war文件部署在Tomcat服务器中时,它就不起作用了。
我尝试了以下代码。它在 tomcat8-stdout 文件中打印আনোয়ার。所以我认为在将数据从浏览器传输到服务器、从服务器传输到数据库时会出现问题。
@PostMapping("/create")
public String create(@ModelAttribute("object") Object object, @RequestParam("photo") MultipartFile photo) throws IOException {
System.out.println(object.getName());
return "redirect:/index";
}
【问题讨论】:
-
从 HTML 表单中移除
accept-charset属性。它不是你想的那样(没有人会)。 -
如果你在名字之外打印
object.getName().length(),你会得到什么?
标签: java spring-boot tomcat encoding utf-8