Подтвердить что ты не робот

Длина строки отличается от 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> ограничен.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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