我们在读取 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
- 完整的日志输出:https ://gist.github.com/3716033
- 应用程序测试用例来源:https ://gist.github.com/3716159 - 针对 orbeon-3.9.1.201202031753-PE 编写和测试
该错误引用%80
了撇号的多字节编码的第二个字节。请注意,在日志中不仅主题会引发异常,而且 xforms 检查器也会引发异常。
看起来 URL 被解码为 Latin1 而不是 UTF-8,因为调试处理器列出it???s a message
了三个字符作为撇号。到目前为止,在我的研究中,HTTP 似乎没有办法指定查询字符串本身的编码。
- 使用 oxf:request 读取时,有没有办法指定查询字符串的编码?我没有看到处理器的配置属性或 properties-local.xml 中设置默认值的任何相关内容。
- 如果没有,有没有办法强制字符串的相关编码?我怀疑这可以通过 XSLT 完成,但找不到示例。我相信我想要与 ruby 的String#force_encoding等效的东西。
- 如果没有,是否有任何其他建议的方法来解决该错误?我目前最坏情况的 hack-fix 是在它到达 servlet 之前使用 mod_rewrite 去除任何有问题的字符。
任何指导和帮助表示赞赏!
(交叉发布到http://mail-archive.ow2.org/ops-users/2012-09/msg00033.html的 ops-users 邮件列表)