2

我正在精神上,我通过表格输入的国际字符没有完全按照输入的方式存储,并且存储的数据没有按照存储在数据库中的方式返回。

如果我输入“çanak çömlek patladı”并在我使用的表单上单击“保存”,页面会显示“çanak çömlek patladı”,但数据库已存储“çanak çömlek patlad? 如果我再次访问该页面,我会得到 '￧anak ￧�mlek patlad?'' 如果我单击表单上的保存而不更改数据库存储的任何内容 '?anak ??mlek patlad?' 并且浏览器显示“?anak ??mlek patlad?”

我的 MySQL 服务器具有以下配置:

default-collation=utf8
collation_server=utf8_unicode_ci
character_set_server=utf8
default-character-set=utf8

数据库字符集是 utf8,数据库排序规则是 utf8_unicode_ci,我使用的表设置为相同。

我的 JSP 文件的第一行是:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

html头是这样的:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Test</title>
</head>

我编译了一个 EncodingFilter 类,它是:

import java.io.IOException;
import javax.servlet.*;

public class EncodingFilter
    implements Filter
{

    public EncodingFilter()
    {
    }

    public void init(FilterConfig filterconfig)
        throws ServletException
    {
        filterConfig = filterconfig;
        encoding = filterConfig.getInitParameter("encoding");
    }

    public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain)
        throws IOException, ServletException
    {
        servletrequest.setCharacterEncoding(encoding);
        filterchain.doFilter(servletrequest, servletresponse);
    }

    public void destroy()
    {
    }

    private String encoding;
    private FilterConfig filterConfig;
}

这个类在我的 web.xml 文件中被引用如下:

<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

我重新启动了我的系统,因此重新启动了 Tomcat 和 MySQL 服务器,检查了日志并且上述任何配置都没有错误。

谁能帮帮忙,不然我头发就没有了?

4

6 回答 6

2

解决了它,我放弃了以前的 db java 类并编写了一个新的 db 函数,因为以前开发的类似乎导致了双重编码问题。

我得到的错误是手动输入“çanak çömlek patladı”直接到数据库,这与 MySQL 没有真正在 varchar 字段上处理 UTF-8 的问题有关。一旦我将该字段更新为 varbinary,一切正常。

我希望这对某人有所帮助,我相信我的头发会重新长出来,感谢所有提供建议的人。

于 2012-07-17T14:20:12.477 回答
0

在从数据库中检索任何内容之前,先执行SET NAMES UTF8查询,然后执行所有查询。然后,您将按照它们的外观获得字符。

于 2012-07-13T10:29:43.890 回答
0

当您连接到数据库时,您可以确保将“characterEncoding”设置为“utf8”吗?此外,如果您在浏览器(例如 fox)中打开您的页面,显示的字符编码是什么?

我认为你应该尝试一下“divide et impera”。了解 MYSQL 是否是问题很重要(我怀疑不是)。为此,您可以在应用程序中插入 UTF 字符串并将其保存到数据库中。如果这不起作用,我们知道问题出在 mysql 上。如果它有效,它可能是 servlet。

在 servlet 级别添加它不会有什么坏处:

request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
于 2012-07-13T10:32:01.993 回答
0

您需要检查以下事项:

  1. 您的数据库应该支持多语言(如果是 MySQL,在安装时它会要求您提供此选项)。
于 2012-07-13T10:38:53.073 回答
0

从http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q8开始

MySQL 中的字符保存列必须能够接受 UTF-8 字符。大多数 MySQL 默认值是针对latin1字符集的,除非您的 DDL 脚本为列设置了字符集。

如果要将表从一种编码更改为另一种编码,可以这样做:

mysql> ALTER TABLE t CONCERT TO CHARACTER SET 'utf8'

如果你真的想这样做,我认为你也可以逐列执行此操作。请注意,对于具有大量数据、大量索引等的表,ALTER 可能需要很长时间。

于 2012-07-16T01:20:59.990 回答
0

我遇到了字符编码问题(JSP-Mysql)。我写了 String URL = "jdbc:mysql://localhost/deneme?useUnicode=true&characterEncoding= ISO-8859-1 "; 并解决了问题。但是,数据库的表必须是UTF-8

于 2013-03-06T22:43:46.503 回答