【发布时间】:2019-06-03 11:02:08
【问题描述】:
我遇到了一个让我发疯的编码问题。我的网站支持英语和西班牙语两种语言。我的一些表(由hibernate生成)有作为排序规则utf8_general_ci,还有一些,我不知道为什么,有latin1_swedish_ci。但令我震惊的是,当人们使用我的联系人表单并在其中输入例如一个带有“ñ”的单词时,我的 Spring 控制器会接收它并向我发送一封电子邮件,这是好的(我的意思是它有 ñ),然后保存MySQL 上的数据。但是,当我检查保存在 MySQL 中的内容(并且我的 Contacts 表有一个 utf8_general_ci 排序规则)时,里面出现了一些可怕的符号来代替“ñ”字符,比如 Ãlvaro Núñez Cabeza de Váca。恢复,jsp页面声明了UTF-8,表是utf8_general_ci,hbn也声明了utf-8:
# hibernate props
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show.sql=true
hibernate.hbm2ddl.auto=update
hibernate.format_sql=true
# hibernate props added to fix 4bytes encoded characters
hibernate.connection.CharSet=utf8mb4
hibernate.connection.characterEncoding=utf8
hibernate.connection.useUnicode=true
但所有这些都没有按预期工作。
我们将非常欢迎任何帮助。
解决方案:至少对我来说,唯一可行的解决方法是在我的 web.xml 中添加一个过滤器。我很确定有更好的方法以更优雅的方式解决编码问题,但在我的情况下,所有内容都配置为使用 UTF-8 并且我的表单的一部分运行良好,但其他人将 Álvar Núñez Cabeza de Vaca 显示为 Ãlvar Núñez卡贝萨德瓦卡。 过滤器是:
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
正如这篇文章中的那样Spring MVC UTF-8 Encoding
【问题讨论】:
标签: mysql hibernate utf-8 character-encoding