UTF-8 URL-декодирование/кодирование
Я поручаю моему URL-адресу отправить такой запрос Ajax:
url += '/' + something + '/' + id;
var response;
$.ajax({
async : false,
type: 'DELETE',
url: url,
...
My removeId
- это переменная, которая включает символ UTF-8. Я обработаю эту переменную со стороны Java следующим образом:
@RequestMapping(value = "/something/{id}", method = RequestMethod.DELETE)
public void myMethod(HttpServletResponse response, @PathVariable String id) {
...
Однако переменная id
на стороне Java отличается от ее оригинальной, потому что символы UTF-8 меняются на странные вещи.
Как я могу отправить символы UTF-8 со стороны JavaScript и преобразовать его снова на моей стороне Java (Spring 3 с REST, мой веб-сервер - Tomcat 7)?
PS 1: Даже я не использую encodeUriComponent
, кажется, что мой URL-адрес сам кодируется?
PS 2: Чтобы сделать вопрос более понятным:
i.e. my id variable is araç and sent URL is: localhost:8080/sdfasf/ara%C3%A7
Когда я вижу, что переменная id имеет это значение:
araç
вместо:
ara%C3%A7
Выполняет ли это Spring (или Tomcat) это? Есть ли способ автоматически декодировать его, когда дело доходит до контроллера в качестве переменной пути (я имею в виду, не записывая ничего как:
URLDecoder.decode(id,"UTF-8");
он будет преобразован автоматически)
Ответы
Ответ 1
Значение id, которое вы видите, должно быть декодировано с использованием кодировки iso-8859-1 вместо utf-8. Кодирование части пути URL-адреса не указано в java-EE, и для его установки нет стандартного api. Для параметров запроса вы можете использовать request.setCharacterEncoding перед доступом к любым параметрам, чтобы их правильно декодировать. CharacterEncodingFilter
выполняет именно это, но не влияет на параметры пути.
Чтобы выполнить эту работу в Tomcat, вы должны установить атрибут URIEncoding
элемента Connector
в своем server.xml
на "utf-8".
Все, что вы хотели знать о кодировке символов в java webapp, можно найти в этом отличном ответе на аналогичный вопрос.
Ответ 2
Я нашел ответ здесь: http://forum.springsource.org/showthread.php?14063-How-to-set-setCharacterEncoding-on-Request
Я сделал эту конфигурацию на моей стороне Spring:
<filter>
<filter-name>SetCharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SetCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
и он отлично работает для UTF-8.
Ответ 3
Вы пытались установить кодировку страницы на странице, где вы встраиваете javascript?
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
Ответ 4
Убедитесь, что для кодировки страницы установлено значение UTF-8, добавив это прямо под стартовым тегом <head>
:
<meta charset="utf-8">
Также убедитесь, что файл JavaScript сохранен с кодировкой UTF-8. Проверьте настройки текстового редактора.
Ответ 5
В JavaScript используется:
data=encodeURIComponent(data);
для кодирования данных, а в Java вы можете:
data=java.net.URLDecoder.decode(data);
Ответ 6
Не нужно кодировать строку на стороне javascript.
Java не поддерживает юникод, поэтому декодирование должно выполняться там как:
output = new String(input.getBytes("ISO-8859-1"), "UTF-8");