UTF-8网站遇到特定浏览器问题

时间:2013-09-10 15:39:30

标签: jquery json oracle jsp character-encoding

我使用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() {
            ...

2 个答案:

答案 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>