HttpServletRequest.getParameter () получает "\ r \ n" для каждой новой строки в поле textarea - PullRequest
3 голосов
/ 05 марта 2012

У меня есть HttpServletRequest, который получает «String myString» из HTML-текстовой области.У меня проблема в том, что каждый раз, когда я пишу текст в текстовой области, для каждой новой строки «String myString» получает «\ r \ n» вместо просто «\ n».См. Мой код ниже.

РЕДАКТИРОВАТЬ: Я включил пример функции readText () в файл HTML.Там переменная данных получает новые строки так же, как "\ n".Это только при получении его от HttpServletRequest, когда он становится "\ r \ n".Дело в том, что мне действительно нужно, чтобы это было просто "\ n", так как я не должен получать никаких дополнительных байтов, чем в исходном тексте.

Как я могу это исправить?Это из-за кодировки UTF-8 в заголовке HTML?

Спасибо большое,

MyServlet.html

<meta http-equiv="content-type" content="text/javascript; charset=UTF-8">
// [...]
<form action="servlet" method="POST" name="formIn">
<textarea name="originalScript" COLS=50 ROWS=25></textarea>
</form>

<script type="text/javascript" charset="UTF-8">
function readText() {
  var s = document.formIn.originalScript.value;
  var data = (s + "").split("");
};
</script>

MyServlet.java

public class MyServlet extends HttpServlet 
{
  public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException 
  {
    String myString=req.getParameter("originalScript");
  }
}

1 Ответ

3 голосов
/ 05 марта 2012

Это не зависит от используемой кодировки символов.Это зависит от используемой клиентской платформы.Когда клиент использует операционную систему Windows, каждая новая строка представляется \r\n (CR + LF, возврат каретки и перевод строки).Когда клиент использует операционную систему на основе Unix, такую ​​как Linux, Max OS X, FreeBSD, BeOS и т. Д., Тогда каждая новая строка представляется \n (LF, перевод строки).Были также платформы, использующие \r или \n\r, такие как Commodore, Apple II, Acorn и т. Д., Но эти платформы считаются древними и вряд ли будут использоваться в наши дни.

Обратите внимание, что \n показывает просто отлично, как полноценный разрыв строки в Windows, и что \r\n также должен прекрасно отображаться как разрыв строки в Unix.То, что Windows использует \r\n, обусловлено лишь историческими причинами, и то, что Windows все еще использует его, обусловлено причинами обратной совместимости.

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

Если у вас возникли проблемы с этим, то вы, вероятно, делаете вещи неправильно.Например, возможно, вы разделяете на \n только для получения массива строк, который приводит к тому, что \r остается нетронутым.В таком случае лучше использовать BufferedReader, который будет прозрачно обрабатывать \n и \r\n в методе readLine().

Например

BufferedReader reader = new BufferedReader(new StringReader(string));
List<String> lines = new ArrayList<String>();

for (String line = null; (line = reader.readLine()) != null;) {
    lines.add(line);
}

// ...

Или когда вы заменяете строку \n на <br/>, чтобы разрывы строк отображались в разметке HTML, вы также можете рассмотреть возможность использования CSS white-space: pre;вместо этого на родительском элементе HTML, содержащем текст.

См. также:


Не имеет отношения к конкретной проблеме, ваш тег <meta> недопустим для HTML-страницы.Это должно быть text/html.Кроме того, когда страница обслуживается HTTP-запросом, заголовок ответа Content-Type будет переопределять любой <meta http-equiv="content-type">.Теги <meta> используются только при просмотре страницы из файловой системы локального диска.Чтобы узнать больше о кодировке символов, обратитесь к этой статье (опять же, не имеет отношения к вашей конкретной проблеме).

...