Длина строки отличается от кода Javascript и кода Java

У меня есть страница JSP с фрагментом кода проверки Javascript, который ограничивает определенное количество символов при отправке. Я использую <textarea>, поэтому я не могу просто использовать атрибут длины, как в <input type = "text">.

Я использую document.getElementById("text").value.length, чтобы получить длину строки. Я использую Firefox 3.0 в Windows (но я тестировал это поведение и с IE 6). Форма отправляется сервлету J2EE. В моем сервлете Java длина строки параметра больше 2000!

Я заметил, что это можно легко воспроизвести, добавив в <textarea> символы возврата каретки. Я использовал Firebug для определения длины <textare>, и на самом деле она составляет 2000 символов. На стороне Java возврат каретки преобразуется в стиль UNIX (\r\n вместо \n), поэтому длина строки отличается!

Я упустил что-то очевидное или что? Если нет, то как бы вы надежно (кросс-платформенный / браузер) удостоверились, что <textarea> ограничен.

@ François: Всегда заключайте элементы в скобки тегов в обратные галочки (например, форматируйте их как код), иначе они будут удалены при отображении вашего вопроса.

Tomalak 20.01.2009 21:02

просто наткнулся на такую ​​ситуацию. ваша тема сделала мой день, сэр! большое спасибо!

varnie 03.11.2012 18:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
20
2
11 221
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы особенно заботитесь о том, какие окончания строк используются? Почему бы просто не заставить Java конвертировать "\ r \ n" в "\ n"? (Обратите внимание, что «\ r \ n» - это стиль Windows; «\ n» - стиль Unix.)

В качестве альтернативы сделайте обратное при проверке длины в JavaScript.

ОК. Я понял. Я предполагаю, что это означает, что Javascript всегда представляет собой возврат каретки способом UNIX внутри и через его API (например, length()). Каким-то образом меня конвертируют в \r\n, потому что виртуальная машина Java работает в Windows. Хотелось бы, чтобы он был более однородным ...

François P. 20.01.2009 21:08

Я не знаю, какие правила будут применяться в разных браузерах к сервлетам, но нормализация в любом случае должна устранить различия. Кстати, на Mac тоже стоит попробовать, где \ r - нормальный перенос строки.

Jon Skeet 20.01.2009 21:46

+1 Просто удалите все "\ r", и все будут счастливы, какую бы платформу вы ни использовали. Mac включены.

Vincent Robert 03.08.2010 16:18

Вы ограничиваете его до 2000 символов, чтобы он помещался в столбец nvarchar (2000) в базе данных? В противном случае, возможно, просто разрешите перерасход 2% для гибкости на стороне Java.

И Java должна использовать Unicode UTF16 для представления строк. Этот /r должен быть где-то еще, может быть, преобразование в веб-браузере при отправке? Вы пробовали разные браузеры? На разных платформах? Возможно, вам просто придется удалить /r.

Ответ принят как подходящий

На самом деле это не проблема JavaScript (или Java) - оба уровня сообщают точную длину строки, с которой имеют дело. Проблема в вашем случае заключается в том, что строка преобразуется во время передачи HTTP.

Если вам абсолютно необходимо убедиться, что длина строки не превышает определенной длины, вы можете имитировать это преобразование на клиенте, заменив каждый экземпляр «\ n» на «\ n \ r» - но только для целей проверки длины:

textarea.value.replace(/\n/g, "\r\n").length

Примечание: код должен быть textarea.value.replace(/\n/g, "\n\r").length, чтобы найти все вхождения. Исходный код ищет только первое совпадение.

Dan Burzo 04.03.2010 12:07

Это должен быть "\r\n", а не "\n\r".

Christoffer Hammarström 27.04.2010 13:35

Чтобы помнить, что правильным порядком является \r\n, помните, что \r означает возврат каретки (Cr), а \n означает (новая) перевод строки (Lf) в CrLf.

Camilo Martin 08.11.2010 01:28

Я думаю, вам нужно выполнить преобразование / проверку окончания строки как на клиенте, так и на сервере, потому что вы не знаете, какие окончания строки будет использовать клиентский браузер (Firefox отправляет \ n даже в Windows), и если вы разрабатываете серверную часть в Windows и развернуть в Linux, то окончание строк будет обрабатываться по-другому.

Ryan 25.01.2012 18:48

Другие вопросы по теме