在我的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正确编码?我想我的设置正确。
答案 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;