1

我的网络应用程序中有一个输入框,如果我输入以下输入:

字符ʃƪ

在服务器端,当我尝试使用 Jdom 构建 xml 文档时,它会崩溃并引发以下异常:

org.jdom.IllegalDataException:数据“char (3A”对于 JDOM 属性是不合法的:0x1a 不是合法的 XML 字符。

     at org.jdom.Attribute.setValue(Attribute.java:491)      
     at org.jdom.Attribute.<init>(Attribute.java:228)
     at org.jdom.Attribute.<init>(Attribute.java:251)
     at org.jdom.Element.setAttribute(Element.java:1128)

这就是浏览器对 ajax 调用进行编码的方式... &MESSAGE=char%20(3%1AA

在服务器端,当我执行 pRequest.getParameter("MESSAGE"); 它返回给我:“ char (3A

有什么想法吗?

4

3 回答 3

1

它现在正在工作。

我从jQuery插件URLEncode切换到原生javascript函数:

encodeURIComponent()

此外,我发现在 ajax 调用中您可以指定 contentType

contentType: "application/x-www-form-urlencoded; charset=UTF-8"
于 2012-06-21T16:37:19.067 回答
0

正如@rolfl 所怀疑的那样,您的浏览器中有些东西非常奇怪。你在用什么?

如果我们做一些 Unicode 和编码检测工作,我们可以得到关于可能发生的事情的提示。

假设您正在尝试输入这些字符:

  • ʃ, Unicode U+0283(拉丁文小写字母 esh)
  • ƪ,Unicode U+01AA(拉丁字母反转 esh 循环)

我们可以看到浏览器编码源于这两个字符的 unicode 代码点:

  • (, 在 ascii 字符集中恰好是 28
  • 3个,剩下的3个
  • %1A, 1A 不是合法的 URL 字符,所以它被编码
  • A,剩下的A

它是您正在使用的一些 ajax javascript 库吗?也许是时候切换了?

于 2012-06-21T10:35:58.600 回答
0

XML 1.0 规范不允许使用字符 0x1a ......永远。它不是一个 unicode 字符

http://www.w3.org/TR/2008/PER-xml-20080205/#charsets

XML 1.1 规范确实允许 0x1a 字符,我看到:http ://www.w3.org/TR/2004/REC-xml11-20040204/#NT-Char

不过三件事:

  • JDOM 1.x(和 2.x)将拒绝非 XML1.0 字符。
  • 即使在 XML 1.1 中, 0x1a 字符也是“受限制的”(我还不能 100% 确定这意味着什么,我正在调查)。
  • 您确定使用“替换”字符 (0x1a)

不管上述情况如何,我怀疑您在输入框和 JDOM setAttribute(...) 调用之间的代码中存在问题。这些地方之间是否有一些东西正在改变字符编码、序列化或以其他方式改变输入值?我怀疑在调用 JDOM 之前还会发生一些其他问题,这会改变数据,因为您不太可能真的试图将 char 0x1a 作为 XML 字符加载。

于 2012-06-20T17:04:07.923 回答