有辦法做到這一點在Java中(與server.xml
沒有擺弄)
不起作用:
protected static final String CHARSET_FOR_URL_ENCODING = "UTF-8";
String uname = request.getParameter("name");
System.out.println(uname);
// ÏηγÏÏÏÏη
uname = request.getQueryString();
System.out.println(uname);
// name=%CF%84%CE%B7%CE%B3%CF%81%CF%84%CF%83%CF%82%CE%B7
uname = URLDecoder.decode(request.getParameter("name"),
CHARSET_FOR_URL_ENCODING);
System.out.println(uname);
// ÏηγÏÏÏÏη // !!!!!!!!!!!!!!!!!!!!!!!!!!!
uname = URLDecoder.decode(
"name=%CF%84%CE%B7%CE%B3%CF%81%CF%84%CF%83%CF%82%CE%B7",
CHARSET_FOR_URL_ENCODING);
System.out.println("query string decoded : " + uname);
// query string decoded : name=τηγρτσςη
uname = URLDecoder.decode(new String(request.getParameter("name")
.getBytes()), CHARSET_FOR_URL_ENCODING);
System.out.println(uname);
// ÏηγÏÏÏÏη // !!!!!!!!!!!!!!!!!!!!!!!!!!!
作品
:
final String name = URLDecoder
.decode(new String(request.getParameter("name").getBytes(
"iso-8859-1")), CHARSET_FOR_URL_ENCODING);
System.out.println(name);
// τηγρτσςη
工作,但will break if default encoding != utf-8 - 試試這個(省略瞭解碼的調用( ),它是沒有必要的):
final String name = new String(request.getParameter("name").getBytes("iso-8859-1"),
CHARSET_FOR_URL_ENCODING);
正如我前面所說,如果server.xml
與亂作爲:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1"
redirectPort="8443" URIEncoding="UTF-8"/>
(注意上面的URIEncoding="UTF-8"
)的代碼將打破(原因getBytes("iso-8859-1")
應爲getBytes("UTF-8")
)。因此,對於防彈解決方案,您必須獲得URIEncoding
屬性的值。這不幸的是似乎是容器特定的 - 甚至更糟的容器版本特定。爲Tomcat 7你需要這樣的:
import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.ReflectionException;
import org.apache.catalina.Server;
import org.apache.catalina.Service;
import org.apache.catalina.connector.Connector;
public class Controller extends HttpServlet {
// ...
static String CHARSET_FOR_URI_ENCODING; // the `URIEncoding` attribute
static {
MBeanServer mBeanServer = MBeanServerFactory.findMBeanServer(null).get(
0);
ObjectName name = null;
try {
name = new ObjectName("Catalina", "type", "Server");
} catch (MalformedObjectNameException e1) {
e1.printStackTrace();
}
Server server = null;
try {
server = (Server) mBeanServer.getAttribute(name, "managedResource");
} catch (AttributeNotFoundException | InstanceNotFoundException
| MBeanException | ReflectionException e) {
e.printStackTrace();
}
Service[] services = server.findServices();
for (Service service : services) {
for (Connector connector : service.findConnectors()) {
System.out.println(connector);
String uriEncoding = connector.getURIEncoding();
System.out.println("URIEncoding : " + uriEncoding);
boolean use = connector.getUseBodyEncodingForURI();
// TODO : if(use && connector.get uri enc...)
CHARSET_FOR_URI_ENCODING = uriEncoding;
// ProtocolHandler protocolHandler = connector
// .getProtocolHandler();
// if (protocolHandler instanceof Http11Protocol
// || protocolHandler instanceof Http11AprProtocol
// || protocolHandler instanceof Http11NioProtocol) {
// int serverPort = connector.getPort();
// System.out.println("HTTP Port: " + connector.getPort());
// }
}
}
}
}
而且還是你需要調整這個爲多個連接器(檢查出帶有註釋的部分)。然後,你會使用類似:
new String(parameter.getBytes(CHARSET_FOR_URI_ENCODING), CHARSET_FOR_URL_ENCODING);
不過這可能會失敗(IIUC)如果parameter = request.getParameter("name");
與CHARSET_FOR_URI_ENCODING解碼被損壞,所以我用的getBytes得到字節()是不是原來的那些(這就是爲什麼「ISO-8859- 1「默認使用 - it will preserve the bytes)。
URLDecoder.decode(request.getQueryString().split("=")[1],
CHARSET_FOR_URL_ENCODING);
我仍然在尋找在那裏提到request.getParameter("name")
在文檔中的位置並調用URLDecoder.decode()
,而不是返回%CF%84%CE%B7%CE%B3%CF%81%CF%84%CF%83%CF%82%CE%B7
:您可以通過手動解析中的行查詢字符串擺脫這一切字符串?源中的鏈接將不勝感激。
另外,我怎樣才能通過參數的值字符串,比如%CE
? =>請參閱評論:parameter=%25CE
感謝您的解釋。至少我知道我並不瘋狂。我在嘗試request.setCharacterEncoding()的同時尋找解決方案,正如您所說,它似乎沒有做任何事情來幫助解決我的問題。 – 2009-01-22 19:49:32
如果有人使用它,這裏是Jetty的鏈接(默認情況下,Jetty 6+使用UTF-8,除非另有配置):http://docs.codehaus.org/display/JETTY/International+Characters+and+Character+編碼 – 2011-07-16 22:08:15