在读取UTF-8查询字符串时遇到字符编码问题。一个独立的外部应用程序构建链接到我们的Orbeon应用程序,如:使用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。
- 如果没有,是否有其他建议的方法来解决错误?我目前最糟糕的黑客修复方法是在使用mod_rewrite访问servlet之前去掉任何违规字符。
任何指导和帮助表示赞赏!
(交叉张贴到OPS用户在http://mail-archive.ow2.org/ops-users/2012-09/msg00033.html邮件列表)
[RFC 3987](http://www.ietf.org/rfc/rfc3987.txt)指定对于IRI,百分号编码应该表示字符的UTF-8格式,所以你的外部应用程序至少在做一件似是而非的事情。然而,在[RFC 3986](http://www.ietf.org/rfc/rfc3986.txt)之前,URI的定义并未详细指定应对非ASCII数据使用何种字符编码。实际上,软件通常使用HTML页面编码或HTTP标头进行猜测。使用oxf:request来找出'accept-charset'头文件的内容。你能重新配置请求者吗? –