Длина строки отличается от JavaScript до кода Java - PullRequest
20 голосов
/ 20 января 2009

У меня есть страница 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> ограничен.

Ответы [ 3 ]

26 голосов
/ 20 января 2009

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

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

textarea.value.replace(/\n/g, "\r\n").length
9 голосов
/ 20 января 2009

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

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

1 голос
/ 20 января 2009

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

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

...