DataInputStream и UTF-8 - PullRequest
       19

DataInputStream и UTF-8

2 голосов
/ 22 декабря 2010

Я новый программист, и у меня возникла пара проблем с кодом, с которым я работаю.

По сути, код получает форму от другого JSP, читает байты, анализирует данные и отправляет результаты в SalesForce, используя DataInputStream.

   //Getting the parameters from request
 String contentType = request.getContentType();
 DataInputStream in = new DataInputStream(request.getInputStream());
 int formDataLength = request.getContentLength();

 //System.out.println(formDataLength);
 byte dataBytes[] = new byte[formDataLength];
 int byteRead = 0;
 int totalBytesRead = 0;
 while (totalBytesRead < formDataLength) 
 {
  byteRead = in.read(dataBytes, totalBytesRead, formDataLength);
  totalBytesRead += byteRead;
 }

Работает нормально, но только если код обрабатывает нормальные символы. Всякий раз, когда он пытается обработать специальные символы (например, французские символы: àâäæçéèêëîïôùûü), я получаю в результате следующую тарабарщину:

à à ¢ ¤¤Ã¦Ã§Ã © èêà «Ã®Ã¯Ã´Ã¹Ã» ü

Я понимаю, что это может быть проблема DataInputStream и того, как он не возвращает кодированный в UTF-8 текст. Ребята, вы предлагаете какие-либо предложения по решению этой проблемы?

Все файлы .jsp включают <% @ page pageEncoding = "UTF-8" contentType = "text / html; charset = UTF-8"%>, и настройки Tomcat в порядке (URI = UTF-8 и т. Д.). Я попытался добавить:

request.setCharacterEncoding("UTF-8");

и

response.setCharacterEncoding("UTF-8");

безрезультатно.

Вот пример того, как он анализирует данные:

    //Getting the notes for the Case 
 String notes = new String(dataBytes);
 System.out.println(notes);
 String savenotes = casetype.substring(notes.indexOf("notes"));
 //savenotes = savenotes.substring(savenotes.indexOf("\n"), savenotes.indexOf("---"));
 savenotes = savenotes.substring(savenotes.indexOf("\n")+1);
 savenotes = savenotes.substring(savenotes.indexOf("\n")+1);
 savenotes = savenotes.substring(0,savenotes.indexOf("name=\"datafile"));
 savenotes = savenotes.substring(0,savenotes.lastIndexOf("\n------"));
 savenotes = savenotes.trim();

Заранее спасибо.

1 Ответ

7 голосов
/ 22 декабря 2010

Проблема не во входных потоках, поскольку они не обрабатывают символы, а только байты. Ваша проблема в том, что вы конвертируете эти байты в символы. В этом конкретном случае вам нужно указать правильную кодировку в конструкторе String .

String notes = new String(dataBytes, "UTF-8");

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


Кстати, DataInputStream не имеет никакого дополнительного значения в конкретном фрагменте кода. Вы можете просто сохранить его InputStream.

...