有办法做到这一点在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