Ci possono essere molti modi per risolvere problemi di codifica:Qual è la differenza tra "URIEncoding" di Tomcat, filtro di codifica e request.setCharacterEncoding
filtro di codifica come Spring MVC UTF-8 Encoding
Impostazione URIEncoding = UTF 8 in server.xml di Tomcat, ad esempio http://struts.apache.org/release/2.1.x/docs/how-to-support-utf-8-uriencoding-with-tomcat.html.
request.setCharacterEncoding (UTF-8)
Oggi, ho un problema che percorso param non viene decodificato bene come
@ResponseBody
@RequestMapping(value="/context/method/{key}",method=RequestMethod.GET,produces = "application/json;charset=utf-8")
public String method(@PathVariable String key){
logger.info("key="+key+"------------");
}
posso vedere che la chiave viene decodificato male ! Se passassi una parola "新浪"
dal front-end, diventerebbe "æ°æµª"
. Scrivo il codice qui sotto per esaminare se il server sta decodificando questo con "ISO-8859-1":
public static void main(String args[]) throws UnsupportedEncodingException{
String key="新浪";
byte[] bytes=key.getBytes("UTF-8");
String decode=new String(bytes,"ISO-8859-1");
System.out.println(decode);
}
Ed esce con la stessa uscita "æ°æµª"
. così infatti, la variabile path viene decodificata con ISO-8859-1.
E poi cerco di aggiungere un filtro al mio web.xml
per risolvere questo problema:
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Ma lo stesso incomprensibili.
Fino a quando ho impostato al di sotto al mio server.xml
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"
URIEncoding="UTF-8" useBodyEncodingForURI="true" ----Here is Added
/>
e funziona per questo anche io rimuovere il filtro.
Ma sono ancora molto confuso sul problema di codifica. E inoltre, questo è solo il metodo GET, se è il metodo POST, suppongo che la soluzione sarà probabilmente diversa
Qualcuno può spiegare per favore quale differenza di codifica dovremmo prendere per quale tipo di problema?
Grazie!
1.what about 'request.setCharacterEncoding' 2. Ho letto un libro che nel metodo' GET', il pathvar e la stringa di query (URL) sono decodificati separatamente. Pertanto, abbiamo bisogno, e URIEncoding è per URI (percorso var), e 'useBodyEncodingForURI' è per stringa di query su URL .. Questo libro è sbagliato? – Jaskey