Grails 没有正确编码 unicode 字符

rst*_*ter 5 unicode grails

在我的 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.
Run Code Online (Sandbox Code Playgroud)

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

params.detail = params.detail ? new String(params.detail.getBytes("8859_1"), "UTF8") : null
Run Code Online (Sandbox Code Playgroud)

将正确编码 unicode 字符。

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

Jan*_*itz 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"
            .....
Run Code Online (Sandbox Code Playgroud)

在中创建一个新文件 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";
    }
}
Run Code Online (Sandbox Code Playgroud)

确保你Config.groovy有:

grails.views.default.codec = "html"
grails.views.gsp.encoding = "UTF-8"
grails.converters.encoding = "UTF-8"
Run Code Online (Sandbox Code Playgroud)

您的 views/layouts/main.gsp 以:

<%@ page contentType="text/html;charset=UTF-8" %>
Run Code Online (Sandbox Code Playgroud)

问候,