1

我正在使用 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>

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

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

在这里,我在 .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)未显示正常,在文件系统中未正常存储,在第一个 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 中显示正常,但 € 符号未正确存储在数据库中。我能做什么?

4

1 回答 1

0

我试图通过一些硬编码来解决它。从控制器中的数据库中检索文档时,我将 € 替换为 "&euro"; 作为:

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

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

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

于 2013-06-12T10:36:02.757 回答