我尝试做一个 Java 网络应用程序。本地 tomcat 7 服务器一切正常。我有一个jsp文件;
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
在这个文件中,我将表单发送到我的 servlet(post) 和我的 servlet 中;
request.setCharacterEncoding("UTF-8");
并且有效。但在 jelastic tomcat 服务器中它不起作用,这些土耳其字符 'ş'、'ğ'、'ı' 正在插入到 mySql 数据库 '?'。
如果我更新单元格,它在文件中显示为 true。
我能做什么?我尝试了互联网上的一切,但它没有改变。
最佳答案
仔细检查以下设置,确保每个人都知道这是 UTF-8 聚会。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Page Title</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="format-detection" content="telephone=no" />
</head>
<body>
your html content goes here....
</body>
</html>
数据库表使用的是 utf-8 字符集,我不相信数据库默认值,这就是创建表定义有它的原因。
CREATE DATABASE mydb DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_swedish_ci;
CREATE TABLE tMyTable (
id int(11) NOT NULL auto_increment,
code VARCHAR(20) NOT NULL,
name VARCHAR(20) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_swedish_ci;
让 JDBC 连接知道 utf-8 字符集。
<Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource"
maxActive="10" maxIdle="2" maxWait="10000"
username="myuid" password="mypwd"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8"
validationQuery="SELECT 1"
/>
某些 Tomcat 版本不对 GET 或 POST 表单请求使用相同的字符集来源,因此添加 useBodyEncodingForURI 属性以强制 GET 表单解析器 oboye setCharacterEncoding 值。
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" useBodyEncodingForURI="true"
/>
此调用必须在任何过滤器或其他代码尝试从请求中读取参数之前发生。所以尽量早点调用它。
if (req.getCharacterEncoding() == null)
req.setCharacterEncoding("UTF-8");
注意 .jsp 页面中的空白字符。我使用这种技术来设置多个标签标题,看看结束标签和开始标签是如何彼此相邻的。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@
page contentType="text/html; charset=UTF-8" pageEncoding="ISO-8859-1"
import="java.util.*,
java.io.*"
%><%
request.setCharacterEncoding("UTF-8");
String myvalue = "hello all and ÅÄÖ";
String param = request.getParameter("fieldName");
myvalue += " " + param;
%><!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Page Title</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="format-detection" content="telephone=no" />
</head>
<body>
your html content goes here.... <%= myvalue %>
</body>
JSP page contentType 属性是在 http 响应对象中设置的,pageEncoding 是在磁盘文件中使用的。它们不需要匹配,如果页面只使用安全的 us-ascii 字符,我通常使用 ISO-8859-1。不要使用 UTF8WithBOM 格式,因为隐藏的前导 bom 标记字节可能会在某些 J2EE 服务器中产生问题。
最后一件事是如何将字符串写入响应流,如果将字符串转换为字节,请确保它使用的是 utf-8 并让客户端知道。
response.setContentType("text/html; charset=UTF-8");
response.getOutputStream().write( myData.getBytes("UTF-8") );
这是一篇很长的文章,但它几乎涵盖了大多数角落问题。
关于jsp形式的Java UTF-8编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28140382/