在Java2Javascript中正确转换\ u000D \ u000A

时间:2014-05-15 17:21:16

标签: javascript jsp encoding string-comparison

我将数据从HTML-Text-Areas发送到JSP,然后将它们插入到数据库中。

如果重新加载页面,则将数据库记录放在此Text-Area和JavaScript变量中。 该变量用于确定用户是否更改了文本区域的值。

JavaScript中的测试程序非常基础,大部分时间都可以使用:

if(orig_info != document.getElementById('info').value)
//Something has changed!

现在,在某些情况下,即使没有任何更改,也会调用更改过程。我用firebug检查了文本区域和变量,它是相同的文本。 这很奇怪,所以我读了两个字符串的长度:

document.getElementById('info').value.length    231     
orig_info.length                                235

然而,我无法看到4个字符的任何差异所以我做了一个简单的输出:字母的数字,字母,Unicode16并得到了: 第一个是文本区域:document.getElementById('info').value,第二个是变量orig_bemerkung

61  |.  |\u002E|    61  |.  |\u002E
62  |   |\u000A|    62  |   |\u000D
63  |1  |\u0031|    63  |   |\u000A
                    64  |1  |\u0031

现在,我发现\u000D\u000A存在旧问题。

我不知道如何解决这个问题。在服务器上,我编写了以下代码:

ret.append("\ndocument.getElementById('info').innerHTML='").append(StringEscapeUtils.escapeJavaScript(this.getInfo())).append("';");

ret.append("orig_info = '").append(StringEscapeUtils.escapeJavaScript(this.getInfo())).append("';\n");

return ret.toString();

即使两次使用完全相同的代码,Text-Area也会处理与变量不同的内容。 我怎样才能解决orig_info等于document.getElementById('info').value的问题,即使有人之前在文本区使用了Enter?

1 个答案:

答案 0 :(得分:2)

HTML表单帖子的规则明确规定必须使用CR-LF对传输<textarea>值,以便用户键入硬换行符。浏览器(我认为所有这些,甚至更新的IE版本)莫名其妙地将<textarea>值返回给JavaScript代码,仅使用LF表示硬断行。

您可以自行转换价值来解释这种奇怪现象。它是这样的:

function realValue( textareaValue ) {
  textareaValue = textareaValue.replace(/([^\r]|^)\n/g, "$1\r\n");
  return textareaValue;
}

// ...

var xmitValue = realValue( someTextArea.value );