使用Orbeon为查询字符串指定字符编码

时间:2012-09-13 18:05:22

标签: character-encoding url-encoding orbeon xforms

我们在读取UTF-8查询字符串时遇到字符编码问题。一个单独的外部应用程序构建了我们的Orbeon应用程序的链接,例如:

  • http://localhost:8080/ops/encoding-test/?message=hello%20world
  • http://localhost:8080/ops/encoding-test/?message=it%E2%80%99s%20a%20message

我们的应用程序模型使用oxf:request处理器读取查询字符串,然后在视图中显示字符串。在上面的第一种情况中,应用程序正确显示“hello world”而没有问题。在第二个测试用例中,%E2%80%99是UTF-8撇号的URL编码,并导致应用程序出错:

2012-09-13 12:21:43,383 ERROR XSLTTransformer  - Error at line 174 of oxf:/config/theme-examples.xsl:
Illegal HTML character: decimal 128
2012-09-13 12:21:43,384 ERROR ProcessorService  - Exception at line 174 of oxf:/config/theme-examples.xsl
; SystemID: oxf:/config/theme-examples.xsl; Line#: 174; Column#: -1
org.orbeon.saxon.trans.XPathException: Illegal HTML character: decimal 128

错误引用了撇号的多字节编码的第二个字节中的%80。请注意,在日志中不仅主题引发异常,而且xforms检查器也会这样做。

看起来URL正在被解码为Latin1而不是UTF-8,因为调试处理器列出it???s a message,其中包含撇号的三个字符。到目前为止,在我的研究中,似乎HTTP没有办法指定查询字符串本身的编码。

  1. 有没有办法在使用oxf:request读取时指定查询字符串的编码?我没有看到处理器的配置属性或者properties-local.xml中与设置默认值相关的任何内容。
  2. 如果没有,有没有办法强制字符串的相关编码?我怀疑这可以用XSLT完成,但无法找到一个例子。我相信我想要的东西相当于ruby的String#force_encoding
  3. 如果没有,是否有其他建议的方法来解决错误?我目前最糟糕的黑客攻击方法是在使用mod_rewrite之前删除任何有问题的字符,然后才能访问servlet。
  4. 感谢任何指导和帮助!

    (交叉发布到http://mail-archive.ow2.org/ops-users/2012-09/msg00033.html的ops-users邮件列表)

1 个答案:

答案 0 :(得分:3)

Orbeon Forms依赖于servlet API返回的内容:请参阅getParameterMap() in ServletExternalContext。所以这似乎是你需要在应用程序服务器级别设置的东西;如果使用Tomcat,您可以通过adding URIEncoding="UTF-8" on the <Connector>完成此操作。