我正在使用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上显示正常,但是€符号在数据库中没有正确存储。我该怎么办?
答案 0 :(得分:0)
我试图通过一点点硬编码来解决它。在我的控制器中从数据库中检索文档时,我用“&amp; euro”替换€;为:
for (Document doc : folder.getDocuments()) {
doc.setName(doc.getName().replace("€", "€"));
}
现在,它在我的第一个JSP位置(带有$ {document.name}的jQuery)显示正常,但是在我的第二个JSP位置(带有Ajax的位置)显示带有€字符串的名称。 因此,一个名为“test€”的文件首先显示,但在第二个位置显示为“test€”。
正如我在原始问题的更新中所说,似乎整个应用程序都有错误的字符集。我怎样才能正确配置?