проблема с кодированием символов в apache httpclient и сервлете

#servlets #character-encoding

#сервлеты #кодирование символов

Вопрос:

привет, я обмениваюсь данными между методом http-клиентской публикации и сервлетом. если я отправляю английские символы, проблем нет, но если я отправляю на иврите, я получаю????? вместо иврита я использую UTF-8. вот код клиента

 HttpPost post = new HttpPost("http://localhost:8080/dropboxweb/Delete");
            try {

                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
                        3);
                nameValuePairs.add(new BasicNameValuePair("fullpath",full.toString()));
                nameValuePairs.add(new BasicNameValuePair("filename",name));
                nameValuePairs.add(new BasicNameValuePair("user",Config.getInstance().getUsername()));

                post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                HttpResponse response = client.execute(post);
  

и это сервлет

 //response.setContentType("text/html;charset=windows-1255");
        //response.setContentType("text/html;charset=UTF-8");

        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        final String full_path =  request.getParameter("fullpath");
  

я перепробовал все варианты в // ни один не сработал.
я использую tomcat 7.
пожалуйста, помогите

Ответ №1:

Обратитесь к этому, (это помогло мне) Что вы можете порекомендовать, чтобы все заработало? (Как использовать UTF-8 везде) http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q3

Ответ №2:

На стороне клиента вам необходимо убедиться, что следующие строки действительны.

 nameValuePairs.add(new BasicNameValuePair("fullpath", full.toString()));
nameValuePairs.add(new BasicNameValuePair("filename", name));
nameValuePairs.add(new BasicNameValuePair("user", Config.getInstance().getUsername()));
  

Проверьте их с помощью

 System.out.println("fullpath: "   full.toString());
System.out.println("filename: "   name);
System.out.println("user: "   Config.getInstance().getUsername());
  

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

 request.setCharacterEncoding("UTF-8");
  

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

Смотрите также:

Ответ №3:

Насколько я знаю, текущая грамматика [RFC 1521] ограничивает значения параметров (и, следовательно, имя файла) US-ASCII. Вы должны URL кодировать имя файла на клиенте, а URL декодировать его на сервере.

Комментарии:

1. HttpClient и Servlet API уже неявно выполняют кодировку URL. Мое лучшее предположение заключается в том, что System.out.println() целевая консоль просто не настроена на использование UTF-8.