У нас такая же ситуация, т. Е. Наш продукт также должен показывать значимые URL-адреса пользователю практически на всех языках мира. Все наши инструменты и технологии поддерживают UTF-8, поэтому никаких проблем с этим нет. Технически работает экранирование символов UTF-8, но IE (7, 8) отображает отвратительно выглядящие экранированные URL-адреса, тогда как Firefox снимает их с экранирования и отображает красивые URL-адреса, т. Е. «/Français/Banane.html» будет отображаться в IE как «/ fran%» C3% A7ais / Banane.html».
GET после POST / перенаправления после отправки формы вообще не работал, ни отправка URL-адресов UTF-8, ни экранирование URL-адресов UTF-8. Мы также безуспешно пытались использовать числовое кодирование сущностей в стиле XML.
Однако мы наконец нашли способ успешно перенаправить после POST: кодировать строку UTF-8 байтово, используя ISO-8859-1. Никто из нас действительно не понимает, как это может работать в любом случае (как браузер может знать, как его декодировать, так как число байтов на символ utf-8 может изменяться и как браузер узнает, что изначально это был utf-8?), Но это делает.
Вот простой сервлет, чтобы попробовать это:
package springapp.web.servlet;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = -1743198460341004958L;
/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String url = "çöffte.html";
try {
ServletContext context = req.getSession().getServletContext();
// read utf8 encoded russian url
if (context.getResource("/WEB-INF/ru_url.txt") != null){
InputStream is = context.getResourceAsStream("/WEB-INF/ru_url.txt");
if (is != null){
url = IOUtils.toString(is, "UTF-8");
System.out.println(String.format("Redirecting to [%s]", url));
}
}
}
catch (FileNotFoundException fNFEx) {
fNFEx.printStackTrace();
}
catch (IOException ioEx) {
ioEx.printStackTrace();
}
byte[] utfBytes = url.getBytes("UTF-8");
String result = new String(utfBytes, "ISO-8859-1");
resp.sendRedirect(result);
// does not work:
//resp.sendRedirect(url);
//resp.sendRedirect(Utf8UrlEscaper.escapeUtf8(url));
//resp.sendRedirect(Utf8UrlEscaper.escapeToNumericEntity(url));
}
}
Для перенаправления целевой копии скопируйте и вставьте URL любого родного языка, например, из википедии в файл с кодировкой utf-8 (без спецификации!) и сохраните его в каталоге WEB-INF. В нашем примере мы взяли русский URL (http://ru.wikipedia.org/wiki/Заглавная_страница)
и сохраните его в файле с именем 'ru_url.txt'.
Мы создали простое приложение SpringMVC, отображающее любой * .abc URL в тестовый сервлет.
Теперь, если вы запустите приложение и введете что-то вроде 'localhost: 8080 / springmvctest / a.abc', вы будете перенаправлены на сайт русской википедии, а браузер (IE и Firefox, Safari или, возможно, нет) должен показать хороший utf- 8 закодированный, родной russion url.