我正在使用 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 中显示正常,但 € 符号未正确存储在数据库中。我能做什么?