来自jsp格式的Java UTF-8编码

问题描述 投票:1回答:2

我尝试做一个Java Web应用程序。在本地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。

我该怎么办?我尝试互联网上的所有内容,但不会改变。

java mysql jsp tomcat servlets
2个回答
2
投票

仔细检查以下设置,确保每个人都知道它是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&amp;characterEncoding=utf8"
  validationQuery="SELECT 1"
/>

某些Tomcat版本不对GET或POST表单请求使用相同的字符集来源,因此添加useBodyEncodingForURI属性以强制GET表单解析器放弃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" />
</head>
<body>
your html content goes here.... <%= myvalue %>
</body>

JSP page contentType属性是在http响应对象中设置的一个,而pageEncoding是在磁盘文件中使用的属性。他们不需要匹配,如果页面仅使用安全的美国字母字符,我通常使用ISO-8859-1。不要使用UTF8WithBOM格式,因为隐藏的前导Bom标记字节可能会在某些J2EE服务器中造成问题。

最后是如何将字符串写入响应流,如果将字符串转换为字节,请确保它使用的是utf-8并让客户端知道。

response.setContentType("text/html; charset=UTF-8");
response.getOutputStream().write( myData.getBytes("UTF-8") );

这是一篇很长的文章,但它几乎涵盖了大多数关键问题。


0
投票

上面Whome的答案中的“尽早呼叫”一词引起了注意。

protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    if (request.getCharacterEncoding() == null) {
        request.setCharacterEncoding("UTF-8");
    }
    String command = request.getParameter("command");
    ...

作品。但是,>

protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    String command = request.getParameter("command");
    if (request.getCharacterEncoding() == null) {
        request.setCharacterEncoding("UTF-8");
    }
    ...

不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.