0

我已经使用 JSP 构建了一个带有表示层的 Web 应用程序。在每个 JSP 中,我都定义了这样的字符集:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
...

如果用户想要编辑用户配置文件的信息,我将对象加载到表单中。如果页面已在OperaChromeSafariIE 10(在 Windows 7 上)中访问,一旦我将表单发送到后端(Java)并将数据合并到数据库中,则某些字符存储错误。主要是:á, é, í, ó, ú, ... 但是使用Firefox没有问题。

我正在运行 Oracle 11g,这是字符集:

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() {
            ...
4

2 回答 2

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>
于 2014-09-12T14:10:19.370 回答
0

页面的内容编码与提交的表单数据的编码没有任何关系(好吧,无论如何,你关心的任何方式)。

我有点担心JSON.stringify($('#user-update').serializeObject())。调用 tostringify是不必要的;jQuery 会为你做到这一点。这应该足够了:

data: $('#user-update').serializeObject(),

这也应该解决浏览器和服务器之间的所有编码问题 - jQuery 将确保这一点。

为了帮助调试此问题,您必须在以下位置添加日志记录:

console.log($('#user-update').serializeObject());

在 AJAX 请求之前。您还可以使用 Web 浏览器的开发人员工具来查看网络请求和响应。

在服务器端,记录您获得的数据,以确保您不会将垃圾泵入数据库。然后使用 SQL 工具查询数据库中的数据,以确保以正确的方式保存。

最后,在代码再次从数据库中读取数据后记录数据。

将来,我建议为上述每个步骤编写单元测试,因为这样一开始就可以防止这种混乱:-)

于 2013-09-11T08:24:53.240 回答