2012-12-11 61 views
0

我试图从请求标题获取文件名,尽管我已经定义了字符编码问题我的web.xml中的Spring编码筛选器Spring MVC 3.1 - 请求标题字符编码问题[UTF-8]

String fileName = request.getHeader("X-File-Name"); // wrong encoding 

的web.xml

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

而且我已经添加URIEncoding="UTF-8"配置到Tomcat server.xml文件。 并添加了相同的配置JAVA_OPTS。

-DuriEncoding=UTF-8 -Dfile.encoding=UTF-8 

回答

2

那么如果标题总是UTF-8(或ASCII其他),你可以这样做:

public static String reEncode(String input) { 
    Charset w1252 = Charset.forName("Windows-1252"); //Superset of ISO-8859-1 
    Charset utf8 = Charset.forName("UTF-8"); 
    return new String(input.getBytes(w1252), utf8); 
} 

... 

String fileName = reEncode("Mekanizması.pdf"); //request.getHeader("X-File-Name") 
System.out.println(fileName); //Mekanizması.pdf 
+0

非常感谢Esailija的帮助,现在我能够获得正确的价值。 – talha06

+0

非常脆弱,因为有HTTP标头的字符编码保证。 –

+0

@ Michael-O是的,这就是为什么它表示UTF-8或ASCII。如果是在其他随机编码中,他会看到mojibake。我会推荐一个正常的查询参数,fwiw。 – Esailija

0

没有为HTTP标头定义的编码。预计他们最多支持ISO-8859-1。更好地依靠US-ASCII。顾名思义,参数就是URI和它们的参数。没有其他的。

+0

我看,让我怎么能得到的文件从HTTP报头中的权值? – talha06

+0

@ talha06你现在得到的价值是多少? – Esailija

+0

例如,我得到“OnayMekanizması.pdf”而不是“OnayMekanizması.pdf”,这是正确的文件名。 – talha06