我的JSP网页中带有€(欧元字符)的奇怪行为

时间:2013-06-11 18:05:53

标签: jquery spring jsp character-encoding oracle10g

我正在使用Apache tomcat 6,Java,JSP和Oracle开发一个Spring Web应用程序。

在网站上,您可以上传一些文件。这些文件的名称可能包含特殊字符(如á,Ó,€(欧元符号),#...)。 以下问题是当文件具有欧元符号时(Á,ó等工作正常)。

简而言之

当我使用默认编码上传这些文件时,它们没有正确存储在数据库和文件系统中,但它们的名称在JSP中正确显示(仅在某些地方,而不是在任何地方)。当我使用CP850编码上传它们时,它们被正确地存储在数据库和文件系统中,但它们的名称没有在它们正常的JSP位置正确显示。

详细

我正在使用spring的CommonMultipartResolver处理上传,使用app-config.xml中的以下配置:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- one of the properties available; the maximum file size in bytes (2097152 B = 2 MB) -->
    <property name="maxUploadSize" value="1073741824"/>
</bean>

使用jQuery,我的JSP中的文件名显示在2个不同的位置。这是第一个:

            <display:table name="${listDocuments}" requestURI="" id="documents" class="tableResult2" pagesize="10">
                <display:column titleKey="folderForm.name" class="dossierCodeCell" style='width: 250px;max-width: 250px;'>
                    <a href="<c:url value="downloadDoc.html?id=${documents.id}&version=${documents.version}"/>">${documents.name}</a>
                </display:column>
                <display:column titleKey="folderForm.userModification"  style="width:70px" 
                    property="lastModificationUser" class="dossierCodeCell" />
                <display:column titleKey="folderForm.modificationDate"  style="width:120px" 
                    property="lastModificationDate" class="dossierCodeCell" />
            </display:table>

$ {display.name}是我获取文件名称的地方。

第二名是:

<table width="100%">
    <tr>
        <td width="50%">
            <label style='display: inline;' class='fieldTitle'> 
                <b><fmt:message key='folderform.MainHeader' /></b>
            </label> 
            <label style="display: inline;" class='fieldTitle'> <c:out value="${parentFolderName}"></c:out>
            </label>
        </td>
        <td width="50%">
            <label style='display: inline;' class='fieldTitle'> 
                <b>Documento:</b>
            </label> 
            <label style="display: inline;" class='fieldTitle'></label>
            <label style="display: inline;" class='fieldTitle' id="editFileName"></label>
        </td>
    </tr>
</table>

在这里,我在dinedically显示.editFileName标签上的文档名称,单击某个按钮时使用以下jQuery代码:

$('.editDocRow').live('click', function() {
            var params = {};

            params.fileId = $(this).find(".fileId").val();

            $.getJSON("GetFileInfo.html", params, function(data) {

                uploadfileBoxy = new Boxy(htmlPopupEditFiles, {
                    title : "<fmt:message key='button.updloadDocumentVersion'/>",
                    unloadOnHide : true,
                    modal : true
                });

                **$("#editFileName").html(data.fileName);**

            })

        });

使用这个默认配置,当文件名包含一些特殊字符时,文件名没有正确转换(在调试时,你看不到正确的字符):在数据库中(使用SQLDeveloper)没有显示ok,在文件系统中它没有存储好吧,在第一个JSP存储它存储正常,但在第二个JSP位置它没有显示确定。

但是,如果我将commonsMultipartResolver的默认字符集更改为:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- one of the properties available; the maximum file size in bytes (2097152 B = 2 MB) -->
    <property name="maxUploadSize" value="1073741824"/>
    <property name="defaultEncoding" value="Cp-850"/>
</bean>

然后,它存储在数据库和文件系统中,它在第一个JSP位置显示没问题,并且在第二个位置显示正常。所以,这里唯一的问题是在第一个JSP位置显示名称。

我在html网页上使用以下编码:

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>

我试图改变这个字符集没有成功。

有任何帮助吗?感谢

更新

似乎我的整个应用程序没有为€符号采用正确的字符集。当创建一个名称中包含€符号的公司(在另一个网页中)时,虽然它在JSP上显示正常,但是€符号在数据库中没有正确存储。我该怎么办?

1 个答案:

答案 0 :(得分:0)

我试图通过一点点硬编码来解决它。在我的控制器中从数据库中检索文档时,我用“&amp; euro”替换€;为:

for (Document doc : folder.getDocuments()) {
    doc.setName(doc.getName().replace("€", "&euro;"));
}

现在,它在我的第一个JSP位置(带有$ {document.name}的jQuery)显示正常,但是在我的第二个JSP位置(带有Ajax的位置)显示带有€字符串的名称。 因此,一个名为“test€”的文件首先显示,但在第二个位置显示为“test€”。

正如我在原始问题的更新中所说,似乎整个应用程序都有错误的字符集。我怎样才能正确配置?