Grails没有正确编码unicode字符

时间:2012-05-09 07:20:35

标签: grails unicode

在我的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不支持该字符,并且正在保存乱码值。我已经google了一下并且已经阅读过ppl在同一个问题上寻求帮助但不幸的是这些解决方案并不适合我。虽然,我找到了解决这个问题的方法。以下表达式

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

将正确编码unicode字符。

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

2 个答案:

答案 0 :(得分:3)

如果您没有使用Mysql,而是默认提供的HSqlDB,您将看不到 你的编码问题。由于Mysql,InnoDB和UTF-8而出现问题。

因为您正在使用Mysql Connection并且已经设置了 useUnicode=true&characterEncoding=UTF-8到MySql连接URL

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

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" %>

映入眼帘,

答案 1 :(得分:2)

将Dialect设置为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;