Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Конвертирование String в формат передачи строковых


Автор: Alexandr87 22.2.2006, 07:37
Есть строка String, её необходимо конвертнуть в формат %xx%xx%xx...
Помню, что был какой-то класс, но вот какой не помню

Тут, же походу вопрос, как сервер узнает в какой кодировке представлены эти строки.

Автор: tux 22.2.2006, 07:52
Класс такой - http://java.sun.com/j2se/1.5.0/docs/api/java/net/URLEncoder.html. Соответственно для декодирования можно использовать http://java.sun.com/j2se/1.5.0/docs/api/java/net/URLDecoder.html.
Сервер о кодировке запроса ничего не знает если ему явно не указать либо какими-то специфическими настройками сервера либо установкой кодировки перед первым обращением к объекту HttpServletRequest. По умолчанию сервер считает, что кодировка - iso8859-1.

Автор: Alexandr87 22.2.2006, 17:23
Точна он. Спасибо.
А как сообщить серверу, что я намереваюсь передавать параметры в utf-8

Автор: tux 23.2.2006, 09:12
Цитата(Alexandr87 @ 22.2.2006, 22:23 Найти цитируемый пост)
А как сообщить серверу, что я намереваюсь передавать параметры в utf-8

Самый универсальный способ - использовать фильтр, примерно такой:
Код

import java.io.*;
import javax.servlet.*;

public class SelectLanguageFilter implements Filter {
    private String encoding;
    
    public void init(FilterConfig config) throws ServletException {
        encoding = config.getInitParameter("requestEncoding");
        
        if(encoding==null) encoding="koi8-r";
    }
    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain next)
    throws IOException, ServletException {
        request.setCharacterEncoding(encoding);
        next.doFilter(request, response);
    }
    
    public void destroy(){}
}

И в web.xml описать его таким макаром:
Код

<filter>
    <filter-name>SelectLanguageFilter</filter-name>
    <filter-class>ru.esstu.entrant.filter.SelectLanguageFilter</filter-class>
  <init-param>
    <param-name>requestEncoding</param-name>
    <param-value>utf-8</param-value>
  </init-param>
</filter>

<filter-mapping>
    <filter-name>SelectLanguageFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Фильтр будет выполняться перед всеми запросами, приходящими к веб-контейнеру, и устанавливать кодировку до первого обращения к объекту HttpServletRequest.

Некоторые веб-контейнеры и веб-фреймворки дают возможность устанавливать кодировку запроса в своих настройках. В Spring есть реализация такого же фильтра, можно использовать ее.

Автор: Alexandr87 23.2.2006, 17:21
Э, может я не совсем понял, но я имел ввиду работу с уже готовым веб-сервером Apache. Всмысле, я, как клиент, передаю параметры, например в гвест сообщение, и вот как бы мне передать в нужной кодировке.

Автор: tux 23.2.2006, 18:17
Тогда видимо я не совсем понял. У тебя есть готовое приложение, к которому ты посылаешь запрос, правильно? И тебе нужно задать кодировку передаваемого сообщения.
Если ты выполняешь запрос из html-страницы, попробуй задать заголовок Content-type с правильной кодировкой и атрибут acceptCharset в тэге формы:
Код

<form action="/doSomething" acceptCharset="utf-8">
...
</form>

Если выполняешь запрос из программы, например, с помощью Commons-HttpClient, то запрос может выглядеть так:
Код

HttpClient cl = new HttpClient();
HttpMethod m = new GetMethod("http://localhost/doSomething");

m.addRequestHeader("Content-Type", "text/html; charset=UTF-8");
try {
    NameValuePair[] params = new NameValuePair[] {
        new NameValuePair("name", "bla bla")
    };
    cl.executeMethod(m);
    String response = m.getResponseBodyAsString();
} catch (HttpException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

Хотя я не уверен, что все это поможет - кроме посылки правильно закодированного запроса еще и сервер должен понимать в какой кодировке к нему должен прийти запрос.

Автор: Alexandr87 24.2.2006, 05:53
Большое спасибо, именно этот параметр я и имел ввиду, надо наверное будет в следующий раз RFC сначала читать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)