5

在我的 grails 应用程序中,未正确编码 unicode 字符。

我正在使用 grails 1.3.7 和 tomcat 7.0.22。以下是我在我的应用程序中为 unicode 支持配置的设置:

- Set grails.views.gsp.encoding and grails.converters.encoding="UTF-8" in Config.groovy
- Set encoding to UTF-8 in meta tag in the .gsp pages
- Specified 'useUnicode=true&characterEncoding=UTF-8' to the MySql connection URL (DB has characterset set to UTF-8)
- Set URIEncoding="UTF-8" useBodyEncodingForURI="true" to the server.xml file in tomcat
- Specified the attribute accept-charset="UTF-8" of the form tag.

但是,当我提交一个 unicode 字符时,grails 不支持该字符并且正在保存乱码值。我已经四处搜索并阅读了 ppl 在同一问题上寻求帮助,但不幸的是,这些解决方案对我不利。虽然,我找到了解决这个问题的方法。下面的表达式

params.detail = params.detail ? new String(params.detail.getBytes("8859_1"), "UTF8") : null

将正确编码 unicode 字符。

但是,使用这种方法很乏味,因为我必须对应用程序中的所有文本输入执行此操作。为什么 unicode 字符没有被 grails 和/或 tomcat 正确编码?我想我有正确的设置。

4

2 回答 2

6

如果您使用的不是 Mysql,而是默认提供的 HSqlDB,您将看不到编码问题。问题是由于 Mysql、InnoDB 和 UTF-8 引起的。

由于您使用的是 Mysql 连接并且已经设置 useUnicode=true&characterEncoding=UTF-8为 MySql 连接 URL

你仍然需要为 InnoDB 和 UTF-8 添加一个特殊的休眠方言:

Datasource.groovy应包含:

environments {
    development {
        dataSource {         
            ......
            driverClassName = "com.mysql.jdbc.Driver"
            dialect = "com.domain.mysql.dialect.MySQLUTF8InnoDBDialect"
            .....

在中创建一个新文件src/java/com/domain/mysql/dialect/MySQLUTF8InnoDBDialect.java

package com.domain.mysql.dialect;

import org.hibernate.dialect.MySQLInnoDBDialect;

/**
 * Sets the default charset to UTF-8.
 */
public class MySQLUTF8InnoDBDialect extends MySQLInnoDBDialect {

    @Override
    public String getTableTypeString() {
        return " ENGINE=InnoDB DEFAULT CHARSET=utf8";
    }
}

确保您Config.groovy有:

grails.views.default.codec = "html"
grails.views.gsp.encoding = "UTF-8"
grails.converters.encoding = "UTF-8"

您的 views/layouts/main.gsp 以:

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

问候,

于 2012-05-09T12:15:04.903 回答
2

将方言设置为 UTF-8 是行不通的。您还必须修改表或表的列以支持 UTF-8。

这是更改表的命令

ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

或者您可以尝试仅修改要存储 utf-8 的列

使用命令

ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET utf8;
于 2012-05-11T01:06:02.300 回答