Grails 未正确编码 unicode 字符

Posted

技术标签:

【中文标题】Grails 未正确编码 unicode 字符【英文标题】:Grails not encoding the unicode characters properly 【发布时间】:2012-05-17 16:44:03 【问题描述】:

在我的 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 正确编码?我认为我的设置正确。

【问题讨论】:

@IgorArtamonov 实际发布。 浏览器对页面编码的评价是什么? 嗯,浏览器正确编码了 unicode 字符。 好的,我的意思是你对curl --head %YOURSITE%有什么要求? 它说明了什么。喜欢Server: Apache-Coyote/1.1Location: http://local.everest.com:9090/Transfer-Encoding: chunked 【参考方案1】:

如果您使用的不是 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" %>

你好,

一月

【讨论】:

您好 Jan,但我的架构类型为“MyISAM” 我的Config.groovy 有:grails.views.default.codec = "html";grails.views.gsp.encoding = "UTF-8";grails.converters.encoding = "UTF-8" 我的view/layout/main.gsp 有:&lt;%@ page contentType="text/html;charset=UTF-8" %&gt; 好吧,即使那样对我也不起作用。我什至将我的meta 标签更改为&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;,但它仍然不起作用。 你有哪个 webxml 插件?试试至少 1.4 版 @Jan Weitz 谢谢!!!很惊讶这个答案没有得到更多的选票。自定义 MySQLUTF8InnoDBDialect 正是我想要摆脱 latin1 并将表转换为 utf8 的方法。非常感谢。【参考方案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;

【讨论】:

有没有办法通过域类上的映射来声明这种编码?

以上是关于Grails 未正确编码 unicode 字符的主要内容,如果未能解决你的问题,请参考以下文章

JS - 字符编码 (ASCII,Unicode,UTF-8)

Unicode是啥???

字符编码

Python—编码与解码(encode()和decode())

URL 编码 Unicode 字符的正确方法是啥?

如何使用 BeautifulSoup 将 UTF-8 编码的 HTML 正确解析为 Unicode 字符串? [复制]