Grails未能正确编码Unicode字符

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不支持该字符,并且会保存乱码值。我已经在谷歌上搜索并阅读了其他人对此问题的求助,但不幸的是这些解决方案对我没有用。尽管如此,我已经找到了解决这个问题的方法。以下是表达式:

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

这个方法可以正确编码Unicode字符。

然而,使用这种方法很繁琐,因为我必须对应用程序中的所有文本输入执行此操作。为什么Grails和/或Tomcat不能正确编码Unicode字符?我认为我的设置是正确的。


@IgorArtamonov 发布了一条帖子。 - rstarter
好的,我的意思是你用 curl --head %YOURSITE% 命令得到了什么结果? - Igor Artamonov
服务器响应的编码格式有些不规范。但是,正如我在问题中提到的那样,如果“detail”中包含任何Unicode字符,则params.detail = params.detail ? new String(params.detail.getBytes("8859_1"), "UTF8") : null可以正确地呈现Unicode字符。 - rstarter
我刚试图理解你问题的根源。好的,我不坚持。 - Igor Artamonov
如您对我提供的信息不够满意,我随时可以提供其他相关信息。总之,感谢您的关注。 - rstarter
显示剩余4条评论
2个回答

6
如果您不使用默认的HSqlDB而是使用Mysql,您可能会遇到编码问题。这些问题是由于Mysql、InnoDB和UTF-8引起的。
既然您正在使用Mysql连接并已经将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" %>

问候,
Jan

嗨Jan,但我的模式是'MyISAM'类型的。 - rstarter
我的 Config.groovy 文件中包含以下内容: grails.views.default.codec = "html";grails.views.gsp.encoding = "UTF-8";grails.converters.encoding = "UTF-8"我的 view/layout/main.gsp 文件中包含:<%@ page contentType="text/html;charset=UTF-8" %> - Jan Weitz
好吧,即使这对我也不起作用。我甚至已经将我的“meta”标签更改为<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">,但它仍然不起作用。 - rstarter
你使用的是哪个webxml插件?请尝试至少使用1.4版本。 - Jan Weitz
@Jan Weitz 谢谢您!!!很惊讶这个答案没有得到更多的投票。自定义的 MySQLUTF8InnoDBDialect 正是我想要的,可以摆脱 latin1 并将表格转换为 utf8。非常感谢。 - arcseldon

2

将方言设置为UTF-8是不起作用的。您还需要修改表或表的列以支持UTF-8。

这是修改表的命令


ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
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;

2
有没有一种通过域类上的映射声明此编码的方法? - Gene Golovchinsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接