UTF-8 URL декодирование / кодирование - PullRequest
14 голосов
/ 16 ноября 2011

Я даю свой 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");

, он будет преобразован автоматически)

Ответы [ 6 ]

16 голосов
/ 16 ноября 2011

Кажется, что значение id, которое вы видите, декодируется с использованием кодировки iso-8859-1 вместо utf-8. Кодировка части пути URL не указана в java EE, и нет стандартного API для его установки. Для параметров запроса вы можете использовать request.setCharacterEncoding перед доступом к любым параметрам, чтобы они правильно декодировались. CharacterEncodingFilter делает именно это, но не влияет на параметры пути.

Чтобы сделать это в Tomcat, вы должны установить атрибут URIEncoding элемента Connector в его server.xml равным "utf-8".

Все, что вы когда-либо хотели знать о кодировке символов в веб-приложении java, можно найти в этом превосходном ответе на аналогичный вопрос.

3 голосов
/ 16 ноября 2011

Я нашел ответ здесь: 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.

1 голос
/ 16 ноября 2011

Убедитесь, что кодировка страницы установлена ​​в UTF-8, добавив это прямо под начальным тегом <head>:

<meta charset="utf-8">

Также убедитесь, что файл JavaScript сохраняется с кодировкой UTF-8.Проверьте настройки вашего текстового редактора.

1 голос
/ 16 ноября 2011

Вы пробовали установить кодировку страницы на странице, где вы встраиваете JavaScript?

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
0 голосов
/ 06 ноября 2015

Нет необходимости кодировать строку на стороне JavaScript.Java не поддерживает Unicode, поэтому декодирование должно выполняться там:

output = new String(input.getBytes("ISO-8859-1"), "UTF-8");

0 голосов
/ 16 ноября 2011

В JavaScript используйте:

data=encodeURIComponent(data);

для кодирования данных, а в Java вы можете сделать:

data=java.net.URLDecoder.decode(data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...