我使用JSP构建了一个带有表示层的Web应用程序。 在每个JSP中我都定义了这样的字符集:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
...
如果用户想要编辑用户个人资料的信息,我会在表单中加载对象。 如果该页面已在 Opera , Chrome , Safari 或 IE 10 (在Windows 7上)访问过将表单发送到后端(Java)并将数据合并到数据库中,某些字符存储得很糟糕。 主要是:á,é,í,ó,ú,...... 但是对于 Firefox ,没有任何问题。
我正在运行Oracle 11g,这是charset:
SQL> select * from v$nls_parameters;
PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
NLS_LANGUAGE
SPANISH
NLS_TERRITORY
SPAIN
NLS_CURRENCY
Ç
PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
NLS_ISO_CURRENCY
SPAIN
NLS_NUMERIC_CHARACTERS
,.
NLS_CALENDAR
GREGORIAN
PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
NLS_DATE_FORMAT
DD/MM/RR
NLS_DATE_LANGUAGE
SPANISH
NLS_CHARACTERSET
AL32UTF8
PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
NLS_SORT
SPANISH
NLS_TIME_FORMAT
HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT
DD/MM/RR HH24:MI:SSXFF
PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
NLS_TIME_TZ_FORMAT
HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT
DD/MM/RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY
Ç
PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
NLS_NCHAR_CHARACTERSET
AL16UTF16
NLS_COMP
BINARY
NLS_LENGTH_SEMANTICS
BYTE
PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
NLS_NCHAR_CONV_EXCP
FALSE
19 rows selected.
我已检查过编辑其他计算机中的配置文件,结果是一样的。 我不知道问题出在哪里,有什么帮助吗?感谢
更新:表单上的JS代码提交:
$(function() {
$('#user-update').submit(function(event) {
event.preventDefault();
...
$.ajax({
type: 'PUT',
url: '/user/${user.userId}/update',
data : JSON.stringify($('#user-update').serializeObject()),
contentType: 'application/json',
success: function() {
...
答案 0 :(得分:0)
页面的内容编码与提交的表单数据的编码无关(无论如何,无论如何,无论如何)。
我有点担心JSON.stringify($('#user-update').serializeObject())
。拨打stringify
不是必要的; jQuery会为你做这件事。这应该足够了:
data: $('#user-update').serializeObject(),
这也应解决浏览器和服务器之间的所有编码问题 - jQuery将确保这一点。
为了帮助调试此问题,您必须在以下位置添加日志记录:
console.log($('#user-update').serializeObject());
在AJAX请求之前。您还可以使用Web浏览器的开发人员工具查看网络请求和响应。
在服务器端,记录您获得的数据,以确保不将垃圾泵入数据库。然后使用SQL工具查询数据库中的数据,以确保以正确的方式保存它。
最后,在您的代码再次从数据库中读取数据后记录数据。
将来,我建议为上述每个步骤编写单元测试,因为这样可以防止这种混乱: - )
答案 1 :(得分:0)
我通过在CharacterEncodingFilter
文件中添加web.xml
解决了这个问题:
<filter>
<filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>