Для запуска javascript можно использовать внешнюю библиотеку, такую как RHINO или NASHORN. И javascript может оценивать простую формулу без парсинга строки. Не влияет на производительность, если код написан хорошо. Ниже приведен пример с RHINO -
public class RhinoApp {
private String simpleAdd = "(12+13+2-2)*2+(12+13+2-2)*2";
public void runJavaScript() {
Context jsCx = Context.enter();
Context.getCurrentContext().setOptimizationLevel(-1);
ScriptableObject scope = jsCx.initStandardObjects();
Object result = jsCx.evaluateString(scope, simpleAdd , "formula", 0, null);
Context.exit();
System.out.println(result);
}
Вы почти там. EncodeURIComponent правильно кодирует к UTF-8, который является тем, что необходимо всегда использовать в URL сегодня.
проблема состоит в том, что отправленная строка запроса становится искалеченной на пути в Ваш сценарий серверной стороны, потому что getParameter () использует ISO-8559-1 вместо UTF-8. Это происходит с Древних времен перед сетью, обоснованной на UTF-8 для URI/IRI, но это довольно вызывает жалость, что спецификация Сервлета не была обновлена для соответствия действительности, или по крайней мере предоставляет надежную, поддерживаемую возможность для нее.
(Существует request.setCharacterEncoding в Сервлете 2.3, но это не влияет на парсинг строки запроса, и если единственный параметр был считан прежде, возможно некоторым другим элементом платформы, это не будет работать вообще.)
, Таким образом, Вы должны к futz вокруг с определенными для контейнера методами получить надлежащий UTF-8, часто вовлекая материал в server.xml. Это полностью сосет для распределения веб-приложений, которые должны работать где угодно. Поскольку Tomcat видит http://wiki.apache.org/tomcat/FAQ/CharacterEncoding и также What' s различие между " URIEncoding" из Tomcat, Кодируя Фильтр и request.setCharacterEncoding.
Я подозреваю, что искажение данных происходит в запросе, т.е. заявленное кодирование запроса не соответствует тому, который на самом деле используется для данных.
, Что делает request.getCharacterEncoding()
возврат?
я действительно не знаю, как JavaScript обрабатывает кодировку или как заставить его использовать определенного.
необходимо удостовериться, что кодировка используется правильно на всех этапах - НЕ пытаются "зафиксировать" данные при помощи new String()
getBytes()
в точке, где они были уже закодированы неправильно.
Редактирование: Это может помочь иметь страницу источника (та с JavaScript) также закодированный в UTF-8 и объявило как таковой в его Типе контента. Тогда я полагаю, что JavaScript может принять значение по умолчанию к использованию UTF-8 для его запроса - но это не определенное знание, просто догадки.
Вы могли всегда использовать JavaScript для управления текстом далее.
<div id="test">a</div>
<script>
var a = document.getElementById('test');
alert(a.innerHTML);
a.innerHTML = decodeURI("Yahoo!%E2%84%A2");
alert(a.innerHTML);
</script>
Я думаю, что могу заставить следующее работать:
encodeURIComponent(escape(lnk.title))
, Который дает мне %25u2122
(для & #8482) или %25AE
(для & #174), который будет декодировать к %u2122
и %AE
соответственно в сервлете.
я должен тогда быть в состоянии превратить %u2122 в '\u2122'
и %AE в '\u00AE'
относительно легко использование (char) (base-10 integer value of %uXXXX or %XX)
в соответствии и цикле замены с помощью регулярных выражений.
т.е. - соответствие /%u([0-9a-f]{4})/i
, извлеките подвыражение соответствия, преобразуйте его, чтобы основывать 10, превратить его в символ и добавить его к выводу, затем сделайте то же с /%([0-9a-f]{2})/i
У меня та же проблема, и я решил ее путем декодирования Request.getQueryString ()
с помощью URLDecoder () и после извлечения моих параметров.
String[] Parameters = URLDecoder.decode(Request.getQueryString(), 'UTF-8')
.splitat('&');